Hibernate按字段排序,可能为null

时间:2012-12-21 10:48:27

标签: mysql hibernate jpa hql

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

我有这些实体:

@Entity
Entity1{
    <random fields>

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

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

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

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 newbie

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

1 个答案:

答案 0 :(得分:0)

如果你正在使用JPA,使用Annotations对你的问题来说非常简单..就这样我给出一个使用Annotaion的例子

如果域对象中有关联对象的集合,通常需要指定某种默认排序顺序。例如,假设我有域对象时间轴和事件:

@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”之类的语法来命令非结束年份之前的null结束年份。

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