【问题标题】:Hibernate one to one criteria fetching休眠一对一标准获取
【发布时间】:2019-12-03 07:53:57
【问题描述】:

我在 car 和 person 表之间使用休眠一对一映射。但是一个人可能有车也可能没有车。现在,在使用休眠条件从人员表中获取记录时,我只想获取那些拥有汽车的人,即仅在人员表中存在汽车表中相应条目的那些条目。如何使用休眠标准/别名来做到这一点?

下面是一段代码。请帮助您提供必须写入以获取结果的标准或别名:

@Getter
@Setter
@Entity
@Table(name = "Person")
public class Person implements Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "Person_ID")
    private Long personId;

    @OneToOne(mappedBy = "personAsset", cascade = CascadeType.ALL)
    private Car car;
}

@Getter
@Setter
@Entity
@Table(name = "Car")
public class Car implements Serializable {

    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "Car_ID")
    private Long carId;

    @OneToOne
    @JoinColumn(name = "Person_ID")
    private Person personAsset;
}

【问题讨论】:

  • 您是否尝试过使用 JPQL 工作?一个简单的查询将解决您的问题

标签: java hibernate jpa spring-data-jpa


【解决方案1】:

您正在寻找的是 @OneToOne 注释上的 cascadeType orphanRemoval=true

这是你的班级的样子:

@Getter
@Setter
@Entity
@Table(name = "Car")
public class Car implements Serializable {

    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "Car_ID")
    private Long carId;

    @OneToOne(fetch=FetchType.EAGER , cascade=CascadeType.ALL, orphanRemoval=true)
    @JoinColumn(name = "Person_ID")
    private Person personAsset;
}

【讨论】:

    【解决方案2】:
    CriteriaBuilder cb = entityManager.getCriteriaBuilder();
    CriteriaQuery<Person> query = cb.createQuery(Person.class);
    Root<Person> person = query.from(Person.class);
    Predicate predicate = cb.isNotNull(person.join("car"));
    predicates.add(predicate );
    

    【讨论】:

    • 欢迎来到 SO!请为您的答案添加一些解释。
    猜你喜欢
    • 1970-01-01
    • 2011-04-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-09
    相关资源
    最近更新 更多