2013-07-15 54 views
0

我有一個條目MenuItem,它有一種語言。 我也有一個設備,它需要所有菜單項都有設備選擇的語言。 (然後還有一個AccessGroup,它確定設備是否可以訪問MenuItem)JPQL和使用休眠選擇1:n關係

我有一個查詢適用於AccessGroup選擇,但無法考慮如何制定查詢以包含語言選擇。

簡體:

MenuItem 
- id 
- published 
- Language 
- AccessGroup 
- App 

Device 
- id 
- List<Languages> 
- User 

AccessGroup 
- id 
- universal 
- <List>AccessGroupLink 

AccessGroupLink 
- id 
- Device 
- User 
- AccessGroup 
- perpetual 
- validTo 

如何做到這一點的JPQL。目前我已經/嘗試過(使用Play!框架):

return find("SELECT DISTINCT m FROM MenuItem m " + 
        "INNER JOIN m.accessGroups ag " + 
        "LEFT OUTER JOIN ag.accessGroupLinks agl " + 
        "WHERE m.app = ? AND m.language IN ? AND (ag.universal = TRUE OR ((agl.device = ? OR agl.user = ?) AND (agl.validTo >= ? OR agl.perpetual = TRUE))) AND m.published = true", device.app, device.languages, device, device.user, new Date()).fetch(); 

我在device.languages中添加了m.language,但這不起作用。所以我想我必須添加一個JOIN,但由於某種原因無法看到。所以,任何幫助真的很感激。

編輯: 我與查詢得到上面的錯誤是:

一個play.db.jpa.JPABase $ JPAQueryException在執行查詢SELECT DISTINCT米菜單項米INNER JOIN M有被抓,錯誤。 accessGroups ag LEFT OUTER JOIN ag.accessGroupLinks agl WHERE m.app =? AND m.language IN? AND(ag.universal = TRUE OR((agl.device =?OR agl.user =?)AND(agl.validTo> =?OR agl.perpetual = TRUE)))AND m.published = true:org.hibernate .PropertyAccessException:無法通過models.Language.id的反射getter獲取字段值

但是我不明白錯誤,因爲model.Language.id是實體的一部分。

回答

0

你可以使用下面的查詢避免IN子句

return find("SELECT DISTINCT m FROM MenuItem m " + 
        "INNER JOIN m.accessGroups ag " + 
        "LEFT OUTER JOIN ag.accessGroupLinks agl " + 
        "LEFT OUTER JOIN agl.device device " + 
        "LEFT OUTER JOIN device.languages language " + 
        "WHERE m.app = ? AND m.language = language AND (ag.universal = TRUE OR ((agl.device = ? OR agl.user = ?) AND (agl.validTo >= ? OR agl.perpetual = TRUE))) AND m.published = true", device.app, device, device.user, new Date()).fetch();