嵌套实体字段的hibernate顺序,可能有空值

时间:2014-08-27 13:34:33

标签: java hibernate postgresql

我偶然发现了Hibernate的问题。我有2个实体 - 让A和B这样说(实体/表注释无效):

class A {
    @ManyToOne
    @JoinColumn(name = "b_id")
    private B b;
}

class B {
    @Column(name = "name")
    private String name;
}

现在,我正在尝试查询所有 A 实体,并按 B 名称字段对其进行排序' s像这样的实体:

SELECT q FROM A AS q ORDER BY q.b.name asc nulls last

问题是, A 表中的行有空外键( b为空) - 结果上述查询返回< strong b 字段中不包含null的行,并且我希望将它们全部包含在内。

我猜hibernate在没有使用LEFT JOIN(OUTER JOIN?)的情况下加入表,导致跳过空值。

有没有办法改变这种行为?如果我可以通过在实体类中使用注释来解决它,那将是很好的,因为查询生成机制非常被锁定。

2 个答案:

答案 0 :(得分:1)

您可以使用CriteriaBuilder并在entityRoot上设置别名

Root<A> entityRoot = criteriaQuery.from(A);
entityRoot.join("b", JoinType.LEFT).alias("b");
criteriaQuery.select(entityRoot)
                .orderBy(criteriaBuilder.asc(entityRoot.get("b").get("name"))

答案 1 :(得分:0)

您可以使用条件查询但是您必须在使用时创建会话,使用条件访问数据库更简单:

Criteria criteria = session.createCriteria(A.class)

//create alias of your other class to provide ordering according to foriegn key

criteria.createAlias("foreignkey","keyin table A(eg..b)");
criteria.addOrder(Order.asc(b.name));
List list = criteria.getlist();

希望这会有所帮助