我有一个条目MenuItem,它有一种语言。 我还有一个设备需要所有具有设备选择语言的MenuItem。 (然后还有一个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!Framework):
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();
我添加了m.language IN device.languages,但这不起作用。所以我想我必须添加一个JOIN,但由于某些原因无法看到。所以任何帮助都非常感谢。
编辑: 我在上面的查询中得到的错误是:
Play.db.jpa.JPABase $ JPAQueryException已被捕获,执行查询时出错 SELECT DISTINCT m FROM MenuItem m INNER JOIN m.accessGroups ag LEFT OUTER JOIN ag.accessGroupLinks agl WHERE m.app =?和m.language IN? AND(ag.universal = TRUE OR((agl.device =?OR agl.user =?)AND(agl.validTo&gt; =?OR agl.perpetual = TRUE)))和m.published = true :org.hibernate.PropertyAccessException:无法通过模型的反射getter获取字段值.Language.id
但我不明白错误,因为model.Language.id是实体的一部分。
答案 0 :(得分: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();