具有不同结果的Hibernate / Gorm查询和非主键

时间:2017-10-24 06:59:53

标签: hibernate grails hql gorm

我正在尝试解决一个问题,即我正在重写查询以删除重复项并添加当前通过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,
    ]
}

我允许用户输入公司地址的文本,这样如果一个Employee绑定到同一个县的两个地址,查询将返回两行。

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

我试图在HQL中重写查询,因为这是过去为消除重复但仍然能够轻松分页所做的事情。事情进展顺利,直到我加入了对公司加入的最终限制。

在我的约束之前我的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之外,我找不到任何其他方法。

1 个答案:

答案 0 :(得分:0)

您可以使用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。我宁愿自己制作参考表。