Java 休眠按嵌套实体排序字段,可能为空值

Java 休眠按嵌套实体排序字段,可能为空值,java,hibernate,postgresql,Java,Hibernate,Postgresql,我偶然发现了Hibernate的一个问题。我有两个实体——假设A和B也是这样(实体/表注释ommited): 现在,我试图查询所有A实体,并按B实体的名称字段排序,如下所示: SELECT q FROM A AS q ORDER BY q.b.name asc nulls last 问题是,A的表中有一些行的外键为null(b为null)-因此,前面提到的查询只返回在b字段中不包含null的行,我想全部返回 我猜hibernate在不使用左连接(外部连接?)的情况下连接表,导致跳过空值 有没有

我偶然发现了Hibernate的一个问题。我有两个实体——假设A和B也是这样(实体/表注释ommited):

现在,我试图查询所有A实体,并按B实体的名称字段排序,如下所示:

SELECT q FROM A AS q ORDER BY q.b.name asc nulls last
问题是,A的表中有一些行的外键为null(b为null)-因此,前面提到的查询只返回b字段中不包含null的行,我想全部返回

我猜hibernate在不使用左连接(外部连接?)的情况下连接表,导致跳过空值


有没有办法改变这种行为?如果我可以通过在实体类中使用注释来解决这个问题,那就太好了,因为查询生成机制被锁定了。

您可以使用criteria query进行此操作,但您必须在使用时创建会话,使用criteria访问数据库更简单:

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();

希望这有帮助

您可以使用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"))
Root entityRoot=criteriaQuery.from(A);
entityRoot.join(“b”,JoinType.LEFT).别名(“b”);
criteriaQuery.select(entityRoot)
.orderBy(criteriaBuilder.asc(entityRoot.get(“b”).get(“name”))

你所说的查询生成机制是什么意思?它非常通用,在这里我得到了一个特例,它发生在所有查询中的0.001%。我不能使用任何其他机制-我们将JPQL查询创建为字符串,因为我们有相当大的前端查询生成机制。
Root<A> entityRoot = criteriaQuery.from(A);
entityRoot.join("b", JoinType.LEFT).alias("b");
criteriaQuery.select(entityRoot)
                .orderBy(criteriaBuilder.asc(entityRoot.get("b").get("name"))