【问题标题】:Hibernate/Gorm query with distinct results and JOIN on non primary key具有不同结果的 Hibernate/Gorm 查询和非主键上的 JOIN
【发布时间】:2018-04-04 20:54:37
【问题描述】:

我正在尝试解决一个问题,即我正在重写查询以删除重复项并添加当前通过 criteria.list 构造的条件

def criteria = Employee.createCriteria()
criteria.list(offset: offset, max: max) { ... }

我有以下领域类(简写)

class Employee {
    static hasMany = [
      jobs: EmployeeJob,
    ]
}

class EmployeeJob {
    Employee employee
    Company company
}

class Company {
    static hasMany = [
      addresses: Address,
    ]
}

我允许用户输入公司地址的文本,因此如果员工与同一县的两个地址相关联,则查询将返回两行。

在这张罚单之前,我不需要带回与员工相关的公司,但现在这是一项要求。

我试图用 HQL 重写查询,因为这是过去所做的以消除重复但仍然能够轻松分页。事情进展顺利,直到我添加了对 Company join 的最终约束。

在我的约束之前的 from 子句中

fromClause += "left join e.jobs as jobs left join jobs.company as company"

但我需要加入与公司主键无关的条件

"left join e.jobs as jobs left join jobs.company as company with company.scope = :scope"

我相信除了主键之外我不能加入任何东西

Hibernate ticket

org.hibernate.hql.internal.ast.InvalidWithClauseException 
with clause can only reference columns in the driving table

Related SO Post

我已尝试在原始条件查询中添加内容

resultTransformer Criteria.DISTINCT_ROOT_ENTITY

确实删除了重复项,但 pagedResults.getTotalCount() 仍然包含重复项。另一个 SO 用户:

使用 ResultTransformer 时,hibernate 在 SQL 查询中不包含 DISTINCT,所以我们遇到了分页(限制/偏移)的麻烦

我试过了:

Projections.groupProperty("id")

但结果只包含 id。

我已经试过了:

    projections {
        sqlGroupProjection '...', '..', [...], [...]
    }

而且我相信它只是在语法下降后才带回我分组的列。

Hibernate 版本是 4.3.8.1。

有没有我遗漏的方法,或者其中一种方法似乎可行?

在我看来,除了下拉和编写原始 SQL 之外,我找不到任何其他方法。

【问题讨论】:

    标签: hibernate grails hql grails-orm


    【解决方案1】:

    您可以使用HQL 执行以下操作

    def query = "select distinct(e) from Employee e " +
    "left join e.jobs j " + 
    "left join Company c on c.id = j.company.id and c.scope = :scope"
    
    Employee.executeQuery(query, args)
    

    注意:join e.jobs 最终将分为两个 joins。我宁愿自己做那个参考表。

    【讨论】:

    • 我不认为该语法有效,我收到以下错误Path expected for join!
    • @JSchins,我在第二次加入时错过了on。立即尝试。
    • 仍然遇到同样的错误。我很确定对于 HQL,他们要求我们使用 left join e.jobs as jobs.... 类型的语法,我们在其中引用 hasMany 字段的名称。
    • 我做了一些改动。试试这个。
    • 我认为 HQL 不支持加入 ON 子句,而是使用 WITH 代替。 ON 子句仅在 JPQL 中使用(参见 docs.jboss.org/hibernate/orm/5.4/userguide/html_single/…)。此外,只有 Hibernate 5.1 和更高版本支持在连接子句中引用非驱动表(意思是 FROM 表以外的表)。
    猜你喜欢
    • 2019-03-28
    • 1970-01-01
    • 2022-06-11
    • 1970-01-01
    • 2017-01-16
    • 1970-01-01
    • 1970-01-01
    • 2013-07-15
    • 1970-01-01
    相关资源
    最近更新 更多