繁体   English   中英

JPQL并使用Hibernate选择1:n关系

[英]JPQL and selecting 1:n relationships using Hibernate

我有一个菜单项,其中有一种语言。 我也有一个需要所有菜单项的设备,这些菜单项具有该设备选择的语言。 (然后还有一个AccessGroup,它确定设备是否有权访问MenuItem)

我有一个查询,该查询适用于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 m FROM MenuItem m INNER JOIN m.accessGroups ag左侧联接ag.accessGroupLinks agl WHERE m.app =吗? 和m.language IN吗? AND(ag.universal = TRUE或((agl.device =?或agl.user =?)AND(agl.validTo> =?或agl.perpetual = TRUE)))AND m.published = true :org.hibernate。 PropertyAccessException:无法通过反射反射模型获取字段值。Language.id

但是我不明白这个错误,因为model.Language.id是实体的一部分。

您可以通过使用以下查询来避免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();

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM