在createcritera.list中订购空值

时间:2015-02-23 13:49:55

标签: grails gorm

排序使用createCriteria创建的列表时遇到问题。 问题是,当我根据某个属性排序时,它的值为null,然后从列表中排除整个对象。 (sort参数通过sorttable列传递)

以下是我的代码示例。

SomeClass.createCriteria().list {
 eq('sth', sth)
if (sort == 'someValue') {
                  nestedClass1 {
                   nestedClass2 {
                    nestedClass3 {
                       order('name', sortOrder)
                              } } }
                        }}

问题是例如当nestedCalss1为null时整个对象从列表中删除

2 个答案:

答案 0 :(得分:3)

默认情况下,这样的关联查询是内连接,包括你需要使用左外连接的空值,你可以使用createAlias

import org.hibernate.criterion.CriteriaSpecification

SomeClass.createCriteria().list {
  eq('sth', sth)
  if (sort == 'someValue') {
    createAlias("nestedClass1", "nc1", CriteriaSpecification.LEFT_JOIN)
    createAlias("nc1.nestedClass2", "nc2", CriteriaSpecification.LEFT_JOIN)
    createAlias("nc2.nestedClass3", "nc3", CriteriaSpecification.LEFT_JOIN)
    order("nc3.name", sortOrder)
  }
}

答案 1 :(得分:0)

以下是使空值按列表顺序排在最后的方法:

def c = SomeClass.createCriteria()
List instanceList = c.list {
   eq('sth', sth)
   if (sort == 'someValue') {
       createAlias("nestedClass1", "nc1", CriteriaSpecification.LEFT_JOIN)
       createAlias("nc1.nestedClass2", "nc2", CriteriaSpecification.LEFT_JOIN)
       createAlias("nc2.nestedClass3", "nc3", CriteriaSpecification.LEFT_JOIN)

       if(params.order == "asc") 
   c.addOrder(Order.asc("nc3.name").nulls(org.hibernate.NullPrecedence.LAST))
       else 
   c.addOrder(Order.desc("nc3.name").nulls(org.hibernate.NullPrecedence.LAST))
    }
}
相关问题