自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

JPA的查詢語言:JPQL的關(guān)聯(lián)查詢

開發(fā) 后端
本文主要講解了JPA的查詢語言,從一關(guān)聯(lián)到多的查詢和從多關(guān)聯(lián)到一的查詢來簡單說說關(guān)聯(lián)查詢。詳細(xì)請看下文

從一關(guān)聯(lián)到多的查詢和從多關(guān)聯(lián)到一的查詢來簡單說說關(guān)聯(lián)查詢。

實體Team:球隊。

實體Player:球員。

球隊和球員是一對多的關(guān)系。

Team.java:

  1. package com.cndatacom.jpa.entity;  
  2.    
  3. import java.util.HashSet;  
  4. import java.util.Set;  
  5.    
  6. import javax.persistence.CascadeType;  
  7. import javax.persistence.Column;  
  8. import javax.persistence.Entity;  
  9. import javax.persistence.FetchType;  
  10. import javax.persistence.GeneratedValue;  
  11. import javax.persistence.Id;  
  12. import javax.persistence.OneToMany;  
  13. import javax.persistence.Table;  
  14.    
  15.    
  16. /**  
  17.  * 球隊  
  18.  * @author Luxh  
  19.  */ 
  20. @Entity 
  21. @Table(name="team")  
  22. public class Team{  
  23.    
  24.     @Id 
  25.     @GeneratedValue 
  26.     private Long id;  
  27.        
  28.     /**球隊名稱*/ 
  29.     @Column(name="name",length=32)  
  30.     private String name;  
  31.        
  32.     /**擁有的球員*/ 
  33.     @OneToMany(mappedBy="team",cascade=CascadeType.ALL,fetch=FetchType.LAZY)  
  34.     private Set<Player> players = new HashSet<Player>();  
  35.    
  36.     //以下省略了getter/setter方法   
  37.    
  38.     //......  

Player.java:

  1. package com.cndatacom.jpa.entity;  
  2.    
  3.    
  4. import javax.persistence.CascadeType;  
  5. import javax.persistence.Column;  
  6. import javax.persistence.Entity;  
  7. import javax.persistence.GeneratedValue;  
  8. import javax.persistence.Id;  
  9. import javax.persistence.JoinColumn;  
  10. import javax.persistence.ManyToOne;  
  11. import javax.persistence.Table;  
  12.    
  13.    
  14. /**  
  15.  * 球員  
  16.  * @author Luxh  
  17.  */ 
  18. @Entity 
  19. @Table(name="player")  
  20. public class Player{  
  21.        
  22.     @Id 
  23.     @GeneratedValue 
  24.     private Long id;  
  25.        
  26.     /**球員姓名*/ 
  27.     @Column(name="name")  
  28.     private String name;  
  29.        
  30.     /**所屬球隊*/ 
  31.     @ManyToOne(cascade={CascadeType.MERGE,CascadeType.REFRESH})  
  32.     @JoinColumn(name="team_id")  
  33.     private Team team;  
  34.        
  35.     //以下省略了getter/setter方法  
  36.    
  37.         //......  

1、從One的一方關(guān)聯(lián)到Many的一方:

查找出球員所屬的球隊,可以使用以下語句:

  1. SELECT DISTINCT t FROM Team t JOIN t.players p where p.name LIKE :name 

或者使用以下語句:

  1. SELECT DISTINCT t FROM Team t,IN(t.players) p WHERE p.name LIKE :name 

上面兩條語句是等價的,產(chǎn)生的SQL語句如下:

  1. select 
  2.     distinct team0_.id as id0_,  
  3.     team0_.name as name0_  
  4. from 
  5.     team team0_  
  6. inner join 
  7.     player players1_  
  8.         on team0_.id=players1_.team_id  
  9. where 
  10.     players1_.name like ? 

從SQL語句中可以看到team inner join 到player。inner join要求右邊的表達(dá)式必須有返回值。

不能使用以下語句:

  1. SELECT DISTINCT t FROM Team t  WHERE t.players.name LIKE :name 

不能使用t.players.name這樣的方式從集合中取值,要使用join或者in才行。

2、從Many的一方關(guān)聯(lián)到One的一方:

查找出某個球隊下的所有球員,可以使用以下查詢語句:

  1. SELECT p FROM Player p JOIN p.team t WHERE t.id = :id 

或者使用以下語句:

  1. SELECT p FROM Player p, IN(p.team) t WHERE t.id = :id 

這兩條查詢語句是等價的,產(chǎn)生的SQL語句如下:(產(chǎn)生了兩條SQL)

  1. Hibernate:  
  2.     select 
  3.         player0_.id as id1_,  
  4.         player0_.name as name1_,  
  5.         player0_.team_id as team3_1_  
  6.     from 
  7.         player player0_  
  8.     inner join 
  9.         team team1_  
  10.             on player0_.team_id=team1_.id  
  11.     where 
  12.         team1_.id=?  
  13. Hibernate:  
  14.     select 
  15.         team0_.id as id2_0_,  
  16.         team0_.name as name2_0_  
  17.     from 
  18.         team team0_  
  19.     where 
  20.         team0_.id=? 

從Many關(guān)聯(lián)到One的查詢,還可以使用以下的查詢語句:

  1. SELECT p FROM Player p WHERE p.team.id = :id 

這條語句產(chǎn)生的SQL如下:(產(chǎn)生了兩條SQL)

  1. Hibernate:  
  2.     select 
  3.         player0_.id as id1_,  
  4.         player0_.name as name1_,  
  5.         player0_.team_id as team3_1_  
  6.     from 
  7.         player player0_  
  8.     where 
  9.         player0_.team_id=?  
  10. Hibernate:  
  11.     select 
  12.         team0_.id as id0_0_,  
  13.         team0_.name as name0_0_  
  14.     from 
  15.         team team0 

以上從Many到One的關(guān)聯(lián)查詢都產(chǎn)生了兩條SQL,還可以使用join fetch只產(chǎn)生一條SQL語句。查詢語句如下:

  1. SELECT p FROM Player p JOIN FETCH p.team t WHERE t.id = :id 

這條查詢語句產(chǎn)生的SQL如下:

  1. Hibernate:  
  2.     select 
  3.         player0_.id as id1_0_,  
  4.         team1_.id as id2_1_,  
  5.         player0_.name as name1_0_,  
  6.         player0_.team_id as team3_1_0_,  
  7.         team1_.name as name2_1_  
  8.     from 
  9.         player player0_  
  10.     inner join 
  11.         team team1_  
  12.             on player0_.team_id=team1_.id  
  13.     where 
  14.         team1_.id=? 

原文鏈接:http://www.cnblogs.com/luxh/archive/2012/06/02/2531750.html

責(zé)任編輯:林師授 來源: programmer_luxh的博客
相關(guān)推薦

2012-06-02 00:50:29

JPA查詢語言JPQL

2012-06-02 00:45:36

JPA查詢語言JPQL

2017-07-25 15:35:07

MysqlMysql優(yōu)化LIMIT分頁

2009-09-25 10:22:35

Hibernate多表

2020-11-05 10:59:45

Mybatis

2010-06-03 09:24:46

Oracle

2021-09-02 18:36:35

SQLWhereOn

2021-10-12 05:00:27

PandasSQL查詢

2022-11-03 07:30:41

CQLJPQLHQL

2015-03-18 13:18:45

MySQLSQL優(yōu)化

2022-05-11 09:34:15

云原生集群數(shù)倉

2009-06-24 15:57:44

JPQL命名查詢

2023-11-26 23:59:16

PromQL算術(shù)運(yùn)算符

2011-07-20 10:01:22

SQL Server數(shù)關(guān)聯(lián)表

2009-11-13 09:24:58

JPA 2.0Criteria AP

2009-09-29 16:29:40

Hibernate查詢

2022-07-05 10:50:31

數(shù)據(jù)庫查詢實戰(zhàn)

2009-09-23 09:16:25

Hibernate復(fù)合

2009-11-24 19:40:07

PHP關(guān)聯(lián)數(shù)組查詢結(jié)果

2021-05-11 11:05:43

SAL子查詢
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號