我正在尝试连接 2 个表并通过构造函数查询将结果添加到新对象。并非左表中的所有 id 都在右表中。因此,通过外连接,我希望从左表中获取所有结果,并从右表中获取结果,如果没有结果,则为空值。
看起来该对象不能保存空值。当我尝试下面的代码时,我只得到 4 个结果,所有这些结果在另一个表中都有相应的值。当我从 x.x.x.PersonWithPartner 对象中删除参数 2 时,将显示所有 49 个(预期)结果(我只修改了第二个参数,查询是相同的)
我的结论是否正确:空值不能传递给查询构造函数?我尝试将 null 作为第二个参数硬编码,但随后收到一条错误消息,这也让我认为 null 值不能作为参数传递。
我该如何解决这个问题,是否可以使第二个参数可选?因为参数二是一个对象,所以它会自动解析为空值,从而解决我的问题。
我在 pgadmin 中重新创建了查询并得到了我期望的结果。通过删除 LEFT OUTER JOIN(以及对象中的第二个参数),查询将返回我期望的所有记录。
精简查询
SELECT new x.x.x.PersonWithPartner(p, relation.related)
FROM Person p
LEFT OUTER JOIN p.relation relation
x.x.x.PersonWithPartner 对象
@Getter
@Setter
@Entity
public class PersonWithPartner {
private Person person;
private Person partner;
public NatuurlijkPersoonWithPartner(Person person, Person partner) {
this.person = person;
this.partner = partner;
}
我期望每个记录都有一个对象,第一个参数始终填充,第二个参数要么是通过连接找到的对象,要么为空。
最佳答案
试试这个:
SELECT new x.x.x.PersonWithPartner(p, related)
FROM Person p
LEFT OUTER JOIN p.relation relation
LEFT OUTER JOIN relation.related related
我不知道这是否有效。但可能 relation.lated
创建了隐式内部联接。
关于java - 对象中带空参数的 Hql 构造函数查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57603550/