符合标准的Grails

我希望在Grails Criteria中为orderBy子句使用NVL函数。 我该如何使用? 我尝试了多种方法。 有人可以帮我吗?

SQL查询转换成Grails标准:选择* forom Domain_Table按NVL(field1,field2)顺序ASC

试过的方法1:

Domain.createCriteria().list(max:10,offset:10){
   order(field1,'ASC')
   order(field2,'ASC')
}

正常工作,但生成类似SQL查询

Select * forom Domain_Table order by field1 ASC,field2 ASC

这不符合我的要求

方法2:

 Domain.createCriteria().list(max:10,offset:10){
       order(nvl(field1,field2),'ASC')
    }

错误:Nvl不是域类的属性

方法3:

Domain.createCriteria().list(max:10,offset:10){
   projections{
  addProjectionToList(Projections.sqlProjection("nvl(field1,field2) as description", ['description'] as String[], [Hibernate.STRING] as Type[]), 'description'))
           order('description,'ASC')
        }

问题:我正在根据确切的顺序获取记录。 但是,我再次用描述来访问数据库以获取我不想要的域。 还有一个选择是,我可以把属性(名称,别名),我会得到的回应。 但是,我需要查询整个域名。

请帮助我。


您可以使用@Formula作为Entity上的一个人工领域(让我们将其命名为nvl ),然后在排序中使用它。

或者你可以使用Order的自定义实现

public class OrderBySqlFormula extends Order {
    private String sqlFormula;

    /**
     * Constructor for Order.
     * @param sqlFormula an SQL formula that will be appended to the resulting SQL query
     */
    protected OrderBySqlFormula(String sqlFormula) {
        super(sqlFormula, true);
        this.sqlFormula = sqlFormula;
    }

    public String toString() {
        return sqlFormula;
    }

    public String toSqlString(Criteria criteria, CriteriaQuery criteriaQuery) throws HibernateException {
        return sqlFormula;
    }

    /**
     * Custom order
     *
     * @param sqlFormula an SQL formula that will be appended to the resulting SQL query
     * @return Order
     */
    public static Order sqlFormula(String sqlFormula) {
        return new OrderBySqlFormula(sqlFormula);
    }
}

并使用criteria.addOrder(OrderBySqlFormula.sqlFormula("(a + b) desc"));

从这里

http://blog.tremend.ro/2008/06/10/how-to-order-by-a-custom-sql-formulaexpression-when-using-hibernate-criteria-api/


既然你必须使用一个标准,而不修改域类,你的第三种方法是最接近解决方案。

您可以将域类id添加到投影中,获取所有ID,最后调用Domain.getAll()返回实例。 你需要两个查询,但第二个使用主键,所以它会尽可能快地运行。

def ids = Domain.createCriteria().list(max:10,offset:10){
   projections{
      property('id')
      sqlProjection("nvl(field1,field2) as description", 'description', Hibernate.STRING)           
   }
   order('description','ASC')
}*.getAt(0) // Only selects the first column: the ID.

def instances = Domain.getAll(ids)
链接地址: http://www.djcxy.com/p/24337.html

上一篇: Grails with Criteria

下一篇: Error in Grails/GORM: deleted object would be re