您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

如何根据特定顺序对hibernate状态进行排序

如何根据特定顺序对hibernate状态进行排序

select fname from Name
where upper(fname) like :fnameStart or upper(fname) like :fnameMiddle
order by (case when upper(fname) like :fnameStart then 1 else 2 end), fname

query.setParameter("fnameStart", "XX%");
query.setParameter("fnameMiddle", "% XX%");

有了Criteria很多麻烦。首先,您必须在order子句中使用本机sql 。其次,您必须绑定变量。

public class FirstNameOrder extends Order {
    public FirstNameOrder() {
        super("", true);
    }

    @Override
    public String tosqlString(Criteria criteria, CriteriaQuery criteriaQuery) throws HibernateException {
        return "case when upper(FIRST_NAME) like ? then 1 else 2 end";
    }
}

大小写表达式的语法和upper函数名称应根据您的数据库进行更改(当然,如果不同,则应更改列名称)。

将此添加到中很容易Criteria,但是没有API可以绑定参数。

我试图通过将未使用的变量传递给自定义sql限制来欺骗Hibernate,以便将其有效地用于order by子句中的变量:

Criteria criteria = session.createCriteria(Name.class, "name")
   .add(Restrictions.disjunction()
      .add(Restrictions.ilike("name.fname", fname + "%"))
      .add(Restrictions.ilike("name.fname", "%" + " " + fname + "%")))
   .setProjection(Projections.property("name.fname").as("fname"))
   .add(Restrictions.sqlRestriction("1 = 1", fname + "%", StringType.INSTANCE))
   .addOrder(new FirstNameOrder())
   .addOrder(Order.asc("fname"));

而且效果很好。

显然,不建议使用此解决方案,我建议对此查询使用JPQL。

其他 2022/1/1 18:18:00 有476人围观

撰写回答


你尚未登录,登录后可以

和开发者交流问题的细节

关注并接收问题和回答的更新提醒

参与内容的编辑和改进,让解决方法与时俱进

请先登录

推荐问题


联系我
置顶