0

这是查询

SELECT id, name, sub1, sub2, sub1 + sub2 AS total 
FROM mytable 
ORDER BY sub1 + sub2 ASC

我在这里要做的是添加 sub1 和 sub2,结果将命名为 TOTAL,我将使用 TOTAL 作为 Order By。到目前为止,这就是我想出的方法,但它没有呈现正确的结果

sess().createSQLQuery("SELECT *, SUB1+ SUB2 AS TOTAL FROM TRACKS order by TOTAL ").addEntity(Student.class).list();

什么是休眠或查询条件相当于我正在尝试做的事情?

4

2 回答 2

1

JPQL 中没有这样的操作,但是你可以做一个本地查询,如下所示:

"SELECT * FROM TRACKS order by SUB1+ SUB2"

并制作一个像这样的吸气剂:

public Double getTotal(){ //Replace Double for the data type you use
    return sub1 + sub2;
}

这样您就可以根据需要对查询进行排序。

这是你想要做的吗?我不确定我是否完全理解你的问题

于 2013-09-01T01:16:53.293 回答
0

我想说,您有两个选择:映射或自定义 OrderBy 对象。

1)映射:如果Total经常使用,您可以扩展您的实体映射并创建计算/只读属性(参见5.1.11. 属性):

<property name="total" formula="(sub1 + sub2)" insert="false" udpate="false" />

现在,我们可以轻松(在任何地方)将此值用于 Order by:

Criteria criteria = session.createCriteria(MyClass.class);
...
criteria.addOrder(Order.asc("total"));

2) 我们仍然在 OOP 世界中。该criteria.addOrder()操作需要Order对象实例。所以我们可以通过自定义的:'MyOrder'。在我们的例子中,它可以是接受任何有效SQL 语句并将其直接注入 ORDER BY 的对象:

public class MyOrder extends Order {
    public MyOrder(String propertyName, boolean ascending) {
        super(propertyName, ascending);
    }

    public String toSqlString(Criteria criteria, CriteriaQuery criteriaQuery) {
        StringBuilder fragment = new StringBuilder();
        fragment.append(propertyName );
        fragment.append( ascending ? " asc" : " desc" );
        return fragment.toString();
    }
}

现在,我们可以通过这种方式将任何(有效的)SQL 脚本注入 ORDER BY 中:

Criteria criteria = session.createCriteria(MyClass.class);
...
criteria.addOrder(new MyOrder("(sub1 + sub2)", true));
于 2013-09-01T04:59:47.220 回答