看一看:JPA的查询语言-JPQL的关联查询
发布时间:2022-04-02 10:22:00
阅读:次
来源:童裤厂家
从一关联到多的查询和从多关联到一的查询来简单说说关联查询。
实体Team:球队。
实体Player:球员。
球队和球员是一对多的关系。
Team.java:
- packagecom.cndatacom.jpa.entity;
- importjava.util.HashSet;
- importjava.util.Set;
- importjavax.persistence.CascadeType;
- importjavax.persistence.Column;
- importjavax.persistence.Entity;
- importjavax.persistence.FetchType;
- importjavax.persistence.GeneratedValue;
- importjavax.persistence.Id;
- importjavax.persistence.OneToMany;
- importjavax.persistence.Table;
- /**
- *球队
- *@authorLuxh
- */
- @Entity
- @Table(name="team")
- publicclassTeam{
- @Id
- @GeneratedValue
- privateLongid;
- /**球队名称*/
- @Column(name="name",length=32)
- privateStringname;
- /**拥有的球员*/
- @OneToMany(mappedBy="team"拆迁房屋补偿可以继承吗,cascade=CascadeType.ALL,fetch=FetchType.LAZY)
- privateSet<Player>players=newHashSet<Player>();
- //以下省略了getter/setter方法
- //......
- }
Player.java:
- packagecom.cndatacom.jpa.entity;
- importjavax.persistence.CascadeType;
- importjavax.persistence.Column;
- importjavax.persistence.Entity;
- importjavax.persistence.GeneratedValue;
- importjavax.persistence.Id;
- importjavax.persistence.JoinColumn;
- importjavax.persistence.ManyToOne;
- importjavax.persistence.Table;
- /**
- *球员
- *@authorLuxh
- */
- @Entity
- @Table(name="player")
- publicclassPlayer{
- @Id
- @GeneratedValue
- privateLongid;
- /**球员姓名*/
- @Column(name="name")
- privateStringname;
- /**所属球队*/
- @ManyToOne(cascade={CascadeType.MERGE,CascadeType有关拆迁的法律法规有哪些.REFRESH})
- @JoinColumn(name="team_id")
- privateTeamteam;
- //以下省略了getter/setter方法
- //......
- }
1、从One的一方关联到Many的一方:
查找出球员所属的球队,可以使用以下语句:
- SELECTDISTINCTtFROMTeamtJOINt.playerspwherep.nameLIKE:name
或者使用以下语句:
- SELECTDISTINCTtFROMTeamt,IN(t.players)pWHEREp.nameLIKE:name
上面两条语句是等价的,产生的SQL语句如下:
- select
- distinctteam0_.idasid0_,
- team0_.nameasname0_
- from
- teamteam0_
- innerjoin
- playerplayers1_
- onteam0_.id=players1_.team_id
- where
- players1_.namelike?
从SQL语句中可以看到team inner join 到player。inner join要求右边的表达式必须有返回值。
不能使用以下语句:
- SELECTDISTINCTtFROMTeamtWHEREt.players.nameLIKE:name
不能使用t.players.name这样的方式从集合中取值,要使用join或者in才行。
2、从Many的一方关联到One的一方:
查找出某个球队下的所有球员,可以使用以下查询语句:
- SELECTpFROMPlayerpJOINp.teamtWHEREt.id=:id
或者使用以下语句:
- SELECTpFROMPlayerp,IN(p.team)tWHEREt.id=:id
这两条查询语句是等价的,产生的SQL语句如下:(产生了两条SQL)
- Hibernate:
- select
- player0_.idasid1_,
- player0_.nameasname1_,
- player0_.team_idasteam3_1_
- from
- playerplayer0_
- innerjoin
- teamteam1_
- onplayer0_.team_id=team1_.id
- where
- team1_.id=?
- Hibernate:
- select
- team0_.idasid2_0_,
- team0_.nameasname2_0_
- from
- teamteam0_
- where
- team0_.id=?
从Many关联到One的查询,还可以使用以下的查询语句:
- SELECTpFROMPlayerpWHEREp.team.id=:id
这条语句产生的SQL如下:(产生了两条SQL)
- Hibernate:
- select
- player0_.idasid1_,
- player0_.nameasname1_,
- player0_.team_idasteam3_1_
- from
- playerplayer0_
- where
- player0_.team_id=?
- Hibernate:
- select
- team0_.idasid0_0_搬迁不签字可以强拆吗,
- team0_.nameasname0_0_
- from
- teamteam0
以上从Many到One的关联查询都产生了两条SQL,还可以使用join fetch只产生一条SQL语句。查询语句如下:
- SELECTpFROMPlayerpJOINFETCHp.teamtWHEREt.id=:id
这条查询语句产生的SQL如下:
- Hibernate:
- select
- player0_.idasid1_0_,
- team1_.idasid2_1_,
- player0_.nameasname1_0_,
- player0_.team_idasteam3_1_0_,
- team1_.nameasname2_1_
- from
- playerplayer0_
- innerjoin
- teamteam1_
- onplayer0_.team_id=team1_.id
- where
- team1_.id=?
原文链接:http://www.cnblogs.com/luxh/archive/2012/06/02/2531750.html
相关阅读
- 工业洗衣机波轮不转的故障原因及处理高度计笔筒折纸机张力器刀具夹具Frc
- 一文看懂2016年西安LED照明灯具市场曲靖橡胶设备外墙涂料洗眼器瑞风配件Frc
- 美涂士组织美丽健康行活动在遵义隆重举行真空包装房产出售离心机竹木制品测试电缆Frc
- 飞音时代集团无绳电话正式上线二手仪器扣件驱动装置液压机卸扣Frc
- 小心减速玻璃带来速度错觉避免超速锂电池透闪石碟形弹簧反应设备硫化剂Frc
- 中联重科工程起重机突破欧美垄断强势进军埃滤布滤网甲醛检测免疫制剂面粉机铜编织线Frc
- 合兴包装等四家包装行业巨头积极触网五金端子打孔插卡电话振冲器地址簿Frc
- 8月13日齐鲁化工城化工产品价格快报0杀菌剂空调材料集装箱船装载设备可视电话Frc
- 技术派华为云会议告别会议啸叫烦恼0建筑模型礼品盒磁通计输送设备建筑钢材Frc
- 移动HR的威力下一个人力资本管理的热点家电泵汾阳光栅螺柱户外手表Frc