什么是此查询的Hibernate等效项?(添加两列)

时间:2013-09-01 00:57:27

标签: java sql hibernate orm

这是查询

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

我在这里要做的是,我将添加sub1和sub2,结果将命名为TOTAL,我将使用TOTAL for Order By。到目前为止,这是我如何提出但它没有得到适当的结果

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

什么是hibernate或Query Criteria等同于我想要做的事情?

2 个答案:

答案 0 :(得分:1)

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

"SELECT * FROM TRACKS order by SUB1+ SUB2"

并制作一个吸气剂:

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

这样您可以根据需要订购查询。

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

答案 1 :(得分:0)

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

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

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

现在,我们可以轻松地(以及任何地方)使用此值作为Order:

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));