How to order result of hibernate based on a specific order

前端 未结 6 1948
别那么骄傲
别那么骄傲 2021-01-07 19:15

I need to send a query to retrieve values that has a specific group of characters as following:

Lets say I am interested in \'XX\' so it should search for any field

6条回答
  •  南方客
    南方客 (楼主)
    2021-01-07 20:09

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

    With Criteria

    With Criteria it's much trickier. Firstly, you have to resort to native SQL in the order clause. Secondly, you have to bind the variable.

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

    The case expression syntax and the upper function name should be changed in accordance with your database (and the column name if it's different, of course).

    It is easy to add this to the Criteria, but there is no API to bind the parameter.

    I tried to trick Hibernate by passing in an unused variable to the custom sql restriction so that it is effectively used for the variable in the order by clause:

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

    and it works fine.

    Obviously, this solution is not recommended and I suggest using JPQL for this query.

提交回复
热议问题