【问题标题】:createAlias on a Detached Criteria (GORM)分离标准上的 createAlias (GORM)
【发布时间】:2014-02-21 13:04:15
【问题描述】:

对于 Grails 项目,我需要它按关联实体的字段进行排序。喜欢获取按作者姓名排序的条目

def crteria = new DetachedCriteria(Entry)
criteria.list {
  order('author.name', 'asc')
}

当前示例将失败:

org.hibernate.QueryException: could not resolve property: author.name of: Entry

这是 Hibernate 的常见问题,通常通过为 author 引入别名来解决,例如:

criteria.createAlias('author')
criteria.addOrder(Order.asc('author.name')) 

但是Grailsgorm.DetachedCriteria没有这个方法的问题,抛出NoSuchMethodException。而且我不想使用普通的hibernate.DetachedCritera,因为需要支持使用 Groovy 标准编写的遗留代码。

如何添加这样的别名?或者如何在没有它的情况下应用这种排序?

也许有一种方法是创建一个hibernate.DetachedCriteria,添加别名,然后将其转换为gorm.DetachedCriteria

-

PS 什么是疯狂的,groovy order('author.name', 'asc') 适用于集成测试。仅在真正的应用程序上失败,grails run-app

【问题讨论】:

  • 您是否已经尝试使用author 作为关联? criteria.list { author { order('name', 'asc') } }
  • 是的,我试过了。在这种情况下它只是被忽略了

标签: hibernate grails grails-orm


【解决方案1】:

我相信您可以随时从 GORM 标准构建器中获取 DetachedCriteria,并使用 HibernateCriteriaBuilder.getHibernateDetachedCriteria(query) 对其进行修改。

GORM DetachedCriteria 只是底层 Hibernate DetachedCriteria 的构建器接口。

【讨论】:

  • 这是个好主意。但问题是,如果我在应用 GORM 标准之前这样做,这个顺序将被忽略(我相信原始查询只是克隆了,所以我不能将 GORM 的东西应用到原始标准)。而且我不能在 GORM 调用后应用它,因为crit.list {} 返回实际列表。看来我需要访问 Hibernate inside crit.list {} 闭包,就在 GORM 构建 Hibernate Criteria 的那一刻。
  • @Igor:为什么不使用构建的 Hibernate 标准来执行列表?它会返回与使用 GORM 的 crit.list() 执行的查询不同的域实例吗?
  • 因为现有代码与此类不兼容。但现在我重写了这部分并改用 HibernateCriteriaBuilder,效果很好。我应该会接受你的回答
【解决方案2】:

如何添加这样的别名?

如您所说,我们在 DetachedCriteria 中 cannot

如何在没有它的情况下应用这种排序?

其他选项包括withCriteriacreateCriteria和其他各种方式。我现在能想到的最懒惰但肮脏的方式是:

Entry.where{ }.collect()?.sort{ it.author?.name }

我想你也会尝试的。 :)

【讨论】:

  • 该 Jira 链接现已失效——似乎已移至 Github。在this 2019 comment 中,Graeme 指出:“......不支持使用 createAlias,我们添加了在分离标准构造期间定义别名的功能。”和“我相信这在很大程度上解决了这个问题的要求。”,例如employee{'region', 'r') 允许使用groupProperty('r.continent')
猜你喜欢
  • 2014-11-10
  • 2014-03-15
  • 1970-01-01
  • 2011-12-08
  • 1970-01-01
  • 2017-12-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多