【问题标题】:JPQL and selecting 1:n relationships using HibernateJPQL 和使用 Hibernate 选择 1:n 关系
【发布时间】:2013-07-13 04:53:19
【问题描述】:

我有一个具有语言的条目 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!框架):

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 LEFT OUTER JOIN ag.accessGroupLinks agl WHERE m.app = ?和 m.language 输入? 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 是实体的一部分。

【问题讨论】:

    标签: sql hibernate playframework jpql


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 2012-09-11
      • 1970-01-01
      • 1970-01-01
      • 2015-11-28
      • 2012-05-19
      • 2021-09-28
      • 2011-04-02
      • 2012-09-26
      • 1970-01-01
      相关资源
      最近更新 更多