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

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

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

XXRF并且CMKJIEK 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();

回答:

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。

以上是 如何根据特定顺序对hibernate状态进行排序 的全部内容, 来源链接: utcz.com/qa/412461.html

回到顶部