【问题标题】:Hql constructor query with null parameter in object对象中带有空参数的Hql构造函数查询
【发布时间】:2019-08-22 06:53:16
【问题描述】:

我正在尝试加入 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;
    }

我希望每条记录都有一个始终填充第一个参数的对象,第二个参数是连接找到的对象或 null。

【问题讨论】:

  • person 和related 之间有链接表吗?与其他人有关系吗?您查看生成的 SQL 查询了吗?
  • 是的,对象之间存在 OneToMany 和 ManyToOne 关系。还没有。我还不能让它工作。我先试试看。

标签: java hibernate hql


【解决方案1】:

试试这个:

SELECT new  x.x.x.PersonWithPartner(p, related)
FROM Person p
LEFT OUTER JOIN p.relation relation
LEFT OUTER JOIN relation.related related

我不知道这是否有效。但可能relation.related 创建了一个隐式内部连接。

【讨论】:

  • 谢谢,问题解决了。我现在从左表中获取所有记录,其中 null 或右表中的值。
猜你喜欢
  • 2021-10-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-09
  • 1970-01-01
  • 2012-04-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多