我有实体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的限制。我可以很容易地使用本机查询,我目前正在这样做,但我想避免使用它。
是的,它可以在不执行连接和使用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
这不会执行任何联接,因为您直接查询联接列。
您可以简单地运行以下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对象,该对象具有