JPA的查询语言:JPQL的关联查询

  从一关联到多的查询和从多关联到一的查询来简单说说关联查询。

  实体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=?

教育人的,激励人的,安慰人不开心的. 或者是 诗词 诗经里的..

JPA的查询语言:JPQL的关联查询

相关文章:

你感兴趣的文章:

标签云: