我正在尝试解决一个问题,即我正在重写查询以删除重复项并添加当前通过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"
我相信我不能加入除主键之外的任何东西
org.hibernate.hql.internal.ast.InvalidWithClauseException
with clause can only reference columns in the driving table
我尝试将内容添加到原始条件查询
resultTransformer Criteria.DISTINCT_ROOT_ENTITY
确实删除了重复项,但pagedResults.getTotalCount()仍包含重复项。另一个SO用户:
使用ResultTransformer时,hibernate在SQL查询中不包含DISTINCT,因此我们遇到了分页问题(限制/偏移)
我试过了:
Projections.groupProperty("id")
但结果只包含id。
我试过了:
projections {
sqlGroupProjection '...', '..', [...], [...]
}
我认为只有在语法失效后才会将我正在分组的列恢复。
Hibernate版本是4.3.8.1。
有没有这样做的方法我缺少或其中一个似乎可行?
在我看来,除了删除和编写原始SQL之外,我找不到任何其他方法。
答案 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
。我宁愿自己制作参考表。