使用JPQL(HQL) :
select fname from Namewhere upper(fname) like :fnameStart or upper(fname) like :fnameMiddleorder by (case when upper(fname) like :fnameStart then 1 else 2 end), fnamequery.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。



