2017-02-17 145 views
1

我試圖創建一個到多個關係的JPQL,即用戶和設備爲1個用戶可以有一個到多個設備。如果設備屬於用戶且設備名稱正確,我想查找設備的整個對象。JPQL爲一對多關係

如果它是一個SQL查詢的話,我可以做的查詢只對設備如下:

select * from DEVICE where USER_ID = 2 and DEVICENAME = "mypc"; 

其中USER_ID是在設備表的外鍵。但是我怎麼能爲用戶和設備表做JPQL查詢呢?下面是用戶和設備類

@Entity 
public class User { 
@Id 
@GeneratedValue(strategy = GenerationType.TABLE) 
public int id; 
public String username; 
public String firstname; 
public String lastname; 
public String hashPassword; 

@OneToMany(mappedBy = "user") 
public List<Device> devices = new ArrayList<Device>(); 


} 

@Entity 
public class Device { 

    @Id 
    @GeneratedValue(strategy = GenerationType.TABLE) 
    public int id; 
    public String deviceName; 
    @ManyToOne 
    public User user; 
    String deviceOS; 
    String deviceType; 
    String attributes; 
    boolean standard; 
} 
+3

還有,你試過嗎?你有沒有閱讀關於JPQL的文檔? http://docs.jboss.org/hibernate/orm/5.2/userguide/html_single/Hibernate_User_Guide.html#hql-implicit-join –

回答

2

例JPA查詢:Documention

Query query = entityManager.createQuery("SELECT di FROM Device di JOIN di.user u WHERE u.id=:userId and di.deviceName=:deviceName"); 
query.setParameter("userId",userId); 
query.setParameter("deviceName",deviceName); 
List<Device> result = query.getResultList(); 
+0

我按照你的查詢,但它似乎沒有任何結果。它有必要做聯合提取? –

+1

你不需要'取'。但是這個查詢確保User對象在Device對象中。 – ozgur

+1

嘗試輸入LEFT JOIN FETCH而不是JOIN FETCH。 – ozgur

1

您可以使用JPQL path expressions在查詢導航從一個實體到另一個,或指一個實體的屬性一些信息。

更具體地,路徑表達式是沿着@ManyToOne@OneToOne關係導航有用,例如:

SELECT d FROM Device d WHERE d.user.id = :userId AND d.deviceName = :deviceName 

這裏,d.user.id是路徑表達式。

對於JPQL的一般概述,看看偉大的Wikibooks article

+0

我按照你的查詢,但它似乎也沒有結果。查詢是否需要遵循數據庫結構或POJO類本身?因爲POJO類沒有用戶標識,因爲它是外鍵。 –

+1

在JPQL查詢中,您使用實體/ POJO的屬性。數據庫模式並不重要。你的'Device'實體具有'user'屬性,它允許你編寫'd.user'來從'Device'導航到'User'。在'User'中,反過來,你有'id'屬性,所以你可以編寫'd.user.id'。確保數據庫中實際存在滿足條件的實體(id和deviceName),然後按照@jackk提供的答案獲取查詢結果。 –

+0

我跟着@jackk答案,現在看來工作,但我認爲它應該與你的答案一起工作。不管怎樣,謝謝! –