如何根据特定顺序对休眠结果进行排序

2022-09-01 13:11:50

我需要发送一个查询来检索具有特定字符组的值,如下所示:

假设我对“XX”感兴趣,所以它应该搜索其值以“XX”开头或具有“XX”(空格XX)的任何字段。例如,和 是有效结果。XXCDEFPD XXRFCMKJIEK XX

我有以下查询返回正确的结果,但我需要以一种方式对它们进行排序,即它首先返回开头的那些结果,然后返回其他结果。具体如下:XX

XXABCD
XXPLER
XXRFKF
AB XXAB
CD XXCD
ZZ XXOI
POLO XX

法典

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"));
        List<String> names = (List<String>) criteria.list();

答案 1

使用 JPQL (HQL)

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

使用标准

随着它要棘手得多。首先,您必须在子句中求助于本机 SQL。其次,您必须绑定变量。Criteriaorder

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";
    }
}

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

很容易将其添加到 中,但没有 API 来绑定参数。Criteria

我试图通过将未使用的变量传递给自定义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。


答案 2

Hibernate支持Order:http://docs.jboss.org/hibernate/orm/4.2/devguide/en-US/html/ch11.html#ql-ordering 由于特殊标准,我认为您必须在Hibernate中自定义Order。此链接可能会有所帮助: http://blog.tremend.ro/2008/06/10/how-to-order-by-a-custom-sql-formulaexpression-when-using-hibernate-criteria-api/


推荐