当前位置: 首页 > 知识库问答 >
问题:

使用JPA查询可为空的@OneToOne关系

卢杰
2023-03-14

我有实体1实体2。他们有一个不可撤销的关系。

@Entity
class Entity1 {

   @Id
   @Column(name = "id")
   private Long id;

   @OneToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL, mappedBy = "entity2")
   @JoinColumn(nullable = true)    
   private Entity2 entity2;
   ...
}

如何查询具有空Entity2的所有Entity1对象?

因为如果我这样做:

SELECT e FROM Entity1 e WHERE e.entity2 IS NULL

JPA引擎在两个表之间进行连接,并放置一个无用的WHERE子句(WHERE entity_id=null)。恢复时,它会执行一个无用的本机SQL。怎么能

当前解决方案:

阅读OpenJPA文档时,我发现应该使用本机查询来解决JPA的限制。我可以很容易地使用本机查询,我目前正在这样做,但我想避免使用它。

共有2个答案

卫招
2023-03-14

是的,它可以在不执行连接和使用JPA查询的情况下完成。签出以下代码段:

java prettyprint-override">@Entity
class Entity1 {
   ...
   @OneToOne(...)
   @JoinColumn(name="entity2ID")
   private Entity2 entity2;
   @Column(name="entity2ID", nullable=true, insertable=true, updatable=true)
   private Long entity2ID;
   ...
}

只需将entity中的连接列映射为insertable/updatable为false。确保绝对不为xyz或joining列提供setter方法。完成后,您可以使用以下查询:

SELECT e FROM Entity1 e WHERE e.entity2ID IS NULL

这不会执行任何联接,因为您直接查询联接列。

盛浩阔
2023-03-14

您可以简单地运行以下JPQL查询:

SELECT e1 
FROM Entity1 e1 
LEFT JOIN e1.entity2 e2
WHERE e2 IS NULL

左联接是您要查找的内容。

 类似资料:
  • 我有两个类具有单向的单人关系: 当我救了这些类,一切都很好。现在,我想基于现有的a检索另一个。我创建了一个CriteriaQuery,它基本上是“Select*FROM OTHERE WHERE a=:a”。但是当我将A类型的对象设置到查询中时,它将失败。查看数据库,我可以看到另一个.a字段实际上是一个varchar,其值为“typeA:123”(其中123是a对象的ID)。不幸的是,我不能在这里

  • 我使用的是spring boot版本2.0.3.Release和spring data jpa版本2.0.8.Release。我有两个表TableA、TableB,它们是一对一映射的。

  • 问题内容: 我接下来的两个实体之间具有OneToOne关系: 我正在尝试运行以下代码: 但是我得到这个错误: 我可以“解决”它,将代码更改为: 我的问题是,哪种方法可以持久保持OneToOne关系?在我的代码中,为什么要保存关系的两个部分以使其起作用? 问题答案: 再来一次。 每个双向关联都具有两个方面:所有者方面和相反方面。反面是具有属性的那一面。所有者方是另一方。JPA / Hibernate

  • 当通过邮递员插入员工记录时,我得到了以下异常。 我有以下表格:1。emp_登机_详情- 异常:“org.hibernate.TransientPropertyValueException:对象引用了未保存的临时实例-在刷新之前保存临时实例:com.boarding.preboardingentities.Empboardingdetails.SubcontainDetails- 这是我的课程: 由

  • 问题内容: 我有一个表具有另一个表的外键(许多关系),但我希望它可以为空。 像这样: 但是抛出和表示子类型不能为null。有什么办法可以使ManyToOne接受null? 问题答案: 您需要设置: 不。 该是指示DDL生成工具,包括SQL列类型约束。

  • 我正在开发一个人力资源管理应用程序,所以我对如何通过JPA管理实体感到困惑。 我的情况是一组多语言上下文中的表:-employees-departments-languages-departments_languages 在我的数据库表之后: 从这个查询中,我需要员工信息,以及部门名称(假设languageId为1) 从eclipse JPA控制台执行查询将返回一个Employee对象,该对象具有