Jac*_*ack 22 java hibernate hibernate-criteria
我需要发送一个查询来检索具有特定字符组的值,如下所示:
假设我对'XX'感兴趣,所以它应该搜索其值以'XX'开头或具有'XX'(空格XX)的任何字段.例如XXCDEF,PD XXRF并且CMKJIEK XX是有效的结果.
我有以下查询
返回正确的结果,但我需要以一种
方式对它们进行排序,它首先返回那些XX在开头然后返回其他结果.如下:
XXABCD
XXPLER
XXRFKF
AB XXAB
CD XXCD
ZZ XXOI
POLO XX
Run Code Online (Sandbox Code Playgroud)
码
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();
Run Code Online (Sandbox Code Playgroud)
Dra*_*vic 22
使用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%");
Run Code Online (Sandbox Code Playgroud)
有了Criteria
随着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";
}
}
Run Code Online (Sandbox Code Playgroud)
案例表达式语法和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"));
Run Code Online (Sandbox Code Playgroud)
它工作正常.
显然,不建议使用此解决方案,我建议使用JPQL进行此查询.
| 归档时间: |
|
| 查看次数: |
11955 次 |
| 最近记录: |