我偶然发现了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
我猜hibernate在没有使用LEFT JOIN(OUTER JOIN?)的情况下加入表,导致跳过空值。
有没有办法改变这种行为?如果我可以通过在实体类中使用注释来解决它,那将是很好的,因为查询生成机制非常被锁定。
答案 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();
希望这会有所帮助