HQL中字符串参数的自定义顺序

时间:2011-09-22 19:23:51

标签: hibernate hql

我有一个像这样的HQL查询:

Query query = session.createQuery("from User as user where user.joined!=null order by user.joined desc");

如何将变量User属性设置为查询的排序顺序?我的解决方案:

String order = "user.joined";
Query query = session.createQuery("from User as user where user.joined!=null order by :order desc").setString("order", order);

不会提供有序的查询结果。

3 个答案:

答案 0 :(得分:3)

使用criteria query

List<User> users = session.createCriteria(User.class)
    .add(Restrictions.isNotNull("joined"))
    .addOrder(Order.desc(order))
    .list();

或者,使用HQL:

Query query = session.createQuery("from User as user where user.joined!=null order by user." + order + " desc");

答案 1 :(得分:1)

在第二个查询中,当您使用此方法时调用:

[Hibernate Query object].setString("order", order)

您正在尝试将列名绑定为参数,这是不可能的。

什么是参数(针对此问题)遵循SQL参数定义,它也是JDBC API PreparedStatement中使用的参数定义。

要动态构建查询(除了它的参数),还有其他解决方案,如Matt Ball指出的解决方案。您还可以看到Using a prepared statement and variable bind Order By in Java with JDBC driver

答案 2 :(得分:0)

旧帖子,由Matt Ball提供的有关HQL的答案很容易受到sql注入的攻击。只需遵守条件或进行一些输入清理即可!