【问题标题】:Hibernate order by fields that might be null按可能为空的字段的休眠顺序
【发布时间】:2012-12-08 22:45:06
【问题描述】:

我的猜测是这个问题在某个地方得到了回答,但我似乎找不到合适的关键词来搜索。

我有这些实体:

@Entity
Entity1{
    <random fields>

    @OneToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "entity_2")
    Entity2 e2;//might be null.
}

@Entity
Entity2{
    <random fields>
    String name;
}

我想编写一个查询,返回我的所有 Entity1 的名称,它们按 Entity2 的名称排序。我试过这个:

SELECT e1 from Entity1 e1 ORDER BY e1.e2.name ASC

上述查询(在mysql上测试)的问题是它只返回Entity1,其中e2不为null。

我需要的是一种获取所有 Entity1 的方法,即使 e2 为空。

附言。我也试过这些,结果相同:

SELECT e1 from Entity1 e1 ORDER BY e1.e2 ASC, e1.e2.name ASC
SELECT e1 from Entity1 e1 ORDER BY e1.e2.name ASC, e1.e2 ASC

提前致谢!
//hql新手

编辑:
添加了我使用的 jpa -annotations。

【问题讨论】:

    标签: mysql hibernate jpa hql


    【解决方案1】:

    如果您使用的是 JPA,则使用 Annotations 对您的问题来说非常简单。这样我就举了一个使用 Annotaion 的例子

    当您在域对象中有关联对象的集合时,您通常希望指定某种默认排序顺序。例如,假设我有域对象 Timeline 和 Event:

    @Entity
    class Event {
    
        @Required
        Integer startYear
    
        Integer endYear
    
        @Required
        String description
    
        @ManyToOne
        Timeline timeline
    }
    

    此排序顺序与使用带有“startYear, endYear”排序顺序的 JPA @OrderBy 相同。但是,由于您在 Hibernate 的 @OrderBy 中编写了实际的 SQL,因此您可以利用数据库具有的任何功能,但可能会牺牲跨数据库的可移植性。例如,Oracle 10g 支持使用类似“order by start_year, end_year nulls first”的语法在非空结束年份之前排序空结束年份。

    @org.hibernate.annotations.OrderBy。将 SQL 片段添加到您的域类中不一定是世界上最优雅的事情,但它可能是最实用的事情。

    【讨论】:

    • 如果我理解正确,您的建议是在 Entity1 的 e2 字段上添加 @OrderBy("name")?不幸的是,我们稍后需要对其他属性进行排序的通道非常大..
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-27
    • 1970-01-01
    相关资源
    最近更新 更多