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

休眠顺序为null

刁钧
2023-03-14
问题内容

在按列对desc排序时,与PostgreSQL DB一起使用的Hibernate会将空值设置为大于非空值。

SQL99标准提供了关键字“ NULLS LAST”来声明应将空值设置为低于非空值。

使用Hibernate的Criteria API是否可以实现“ NULLS LAST”行为?


问题答案:

鉴于HHH-465尚未修复,并且由于史蒂夫·埃伯索尔(Steve
Ebersole)给出的原因而不会在近期内修复,因此,最好的选择CustomNullsFirstInterceptor是全局使用该问题的附件,也可以专门使用该附件来更改SQL语句。

我在下面将其发布给读者(归功于Emilio Dolce):

public class CustomNullsFirstInterceptor extends EmptyInterceptor {

    private static final long serialVersionUID = -3156853534261313031L;

    private static final String ORDER_BY_TOKEN = "order by";

    public String onPrepareStatement(String sql) {

        int orderByStart = sql.toLowerCase().indexOf(ORDER_BY_TOKEN);
        if (orderByStart == -1) {
            return super.onPrepareStatement(sql);
        }
        orderByStart += ORDER_BY_TOKEN.length() + 1;
        int orderByEnd = sql.indexOf(")", orderByStart);
        if (orderByEnd == -1) {
            orderByEnd = sql.indexOf(" UNION ", orderByStart);
            if (orderByEnd == -1) {
                orderByEnd = sql.length();
            }
        }
        String orderByContent = sql.substring(orderByStart, orderByEnd);
        String[] orderByNames = orderByContent.split("\\,");
        for (int i=0; i<orderByNames.length; i++) {
            if (orderByNames[i].trim().length() > 0) {
                if (orderByNames[i].trim().toLowerCase().endsWith("desc")) {
                    orderByNames[i] += " NULLS LAST";
                } else {
                    orderByNames[i] += " NULLS FIRST";
                }
            }
        }
        orderByContent = StringUtils.join(orderByNames, ",");
        sql = sql.substring(0, orderByStart) + orderByContent + sql.substring(orderByEnd); 
        return super.onPrepareStatement(sql);
    }

}


 类似资料:
  • 问题内容: 考虑: 查询将是这样的: 如何实现按孩子计数? 换句话说,返回的TParent列表的顺序将由TChildSet计数决定。 我知道@Formula可以在SQL环境中使用。我不确定Lucene是否可以使用类似的东西? 任何帮助,指点,评论甚至批评都欢迎。 非常感谢约翰 问题答案: 在hibernate搜索中,您可以为此创建一个自定义Bridge。 类似于以下内容: 使用自定义桥实现:

  • 问题内容: 有谁知道Hibernate如何知道在调用时是要插入还是要更新数据库中的值? 到目前为止,我仅确定它不依赖于高速缓存中的信息,并且数据库中实体的存在由主键确定。 问题答案: 当您使用Hibernate时,将检查对象是否为瞬态对象(它没有标识符属性),如果是这样,它将通过生成标识符并将其分配给会话来使其持久化。如果对象已经具有标识符,它将执行。 从文档中: saveOrUpdate()执行

  • 问题内容: 基本上,我的问题与这一问题相同,但是对于Java的(JBoss)Hibernate:我们如何使用hibernate标准API将列作为int排序?我想创建一个从字符串列转换为int的订单限制。就像是 唯一的例外是“无法解析属性:[Class]的演员表(id为int)”。我已经尝试过使用int和integer进行cast(as)和convert(,)。 问题答案: 尽管主题很旧,可能是问题

  • 问题内容: 我的数据库是Oracle,我的id列值是Oracle序列,此序列由触发器执行,因此,在插入每一行之前,此触发器使用此序列来获取id值。因此,我对应该在实体类中定义哪个id策略生成感到困惑。 要么 要么 真的很困惑,有人可以阐明这个话题吗?请清楚解释。 问题答案: 我还有一个projet,其中有一个Oracle DB将数据提供给我的@Entity类。如您所说,序列通过触发器生成表PK的I

  • 问题内容: 我们知道有机管局非常好的功能SaveOrUpdate当我们通过任何物体这种方法,知道数据是或新的记录将在数据库中添加。这是功能同时有或在我的代码,我来处理呢? 问题答案: jOOQ也是一样。如果更改记录的主键,则它将使用,否则将使用。 实际上,当您从数据库中读取记录时,调用将触发您所期望的。如果创建新记录,则将对其进行编辑。 在2.6中,克隆记录然后要求jOOQ对其进行更新有些困难(因

  • 问题内容: 是否可以对 不是标识符/不是复合标识符一部分的 某些列使用DB序列? 我正在将hibernate用作jpa提供程序,并且我有一个表,其中包含一些生成的值(使用序列)的列,尽管它们不是标识符的一部分。 我想要的是使用序列为实体创建新值,其中序列的列 不是 主键(的一部分): 然后,当我这样做时: 该ID将被生成,但该属性也将由我的JPA提供程序生成。 为了清楚起见:我希望 Hiberna