当前位置: 首页 > 面试题库 >

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

秦鹏飞
2023-03-14
问题内容

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

可以说我对“ 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();

问题答案:

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

有条件

有了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。



 类似资料:
  • 问题内容: 我需要发送查询以检索具有特定字符组的值,如下所示: 假设我对“ XX”感兴趣,因此它应该搜索其值以“ XX”开头或具有“ XX”(空格XX)的任何字段。例如,并且是有效的结果。 我有以下查询, 返回正确的结果,但我需要对它们进行排序 ,使其首先返回开头的内容,然后返回其他结果。如下: 码 问题答案: 使用JPQL(HQL) : 有条件 有了很多麻烦。首先,您必须在子句中使用本机SQL

  • 我有一个假设 我的目的是以循环的方式基于来订购它。 输入: SortedList:

  • 问题内容: 我试图根据键中的日期对此HashMap进行排序 我的哈希图: 问题答案: 使用代替。正如已经实现的那样,它将在插入时自动排序。 或者,如果您有一个现有的并且想要基于它创建一个,则将其传递给构造函数: 也可以看看: Java教程-地图实现 Java教程-对象排序

  • 问题内容: hibernate状态是否保留LinkedHashSet的顺序?如果是,则如何?如果这取决于数据库的类型,那么我想对PostgreSQL有所了解。 背景: 我知道LinkedHashSet的用途是什么,我之所以问这个原因是因为我正在将执行的某些函数的名称记录到与某些“ functionName”表具有多对多关系的“ logError”表中。我需要这些函数保持与执行它们时相同的顺序,因此

  • 我有一个基于类的React组件,它使用状态项和渲染结果。以下是我如何做到这一点的简短片段: 数据作为数组中的对象接收,如下所示: 我的问题是,在呈现这些项目之前,是否可以按字母顺序对其进行排序?最好的方法是什么?

  • 问题内容: 我有多个数组,我想根据其中一个的排序顺序对所有数组进行排序,如下所示: 我希望函数执行后,数组将如下所示: 问题答案: 您可以执行以下操作:首先根据键控数组的索引的索引对它们进行索引的值对它们进行排序,然后使用: 如果要在任何类型的集合上使它通用(但仍以与std lib集合算法相同的样式返回数组): 以及带有自定义比较器的版本: