java 一对一的关系,java – 一对一关系hibernate导致许多查询

我有一对一的关系

@Entity

@Table(name = "PERSON")

public class Person {

@Id

@GeneratedValue(strategy = GenerationType.AUTO)

@Column(name = "PERSON_ID")

private int personId;

@Column(name = "PERSON_NAME", nullable = false, length = 30)

private String personName;

@OneToOne(mappedBy = "person", cascade = CascadeType.ALL)

private DrivingLicense drivingLicense;

}

@Entity

@Table(name = "DRIVING_LICENSE")

public class DrivingLicense {

@Id

@GeneratedValue(strategy = GenerationType.AUTO)

@Column(name = "LICENSE_NUMBER")

private int licenseNumber;

@Column(name = "DATE_OF_ISSUE")

private Date dateOfIssue;

@OneToOne

@JoinColumn(name = "PERSON_ID", unique = true)

private Person person;

}

目前每个表中有3行

但是当我对下面的人进行查询时

Query query = entityManager.createQuery("from Person p");

获得结果列表后,会产生如下所示的太多查询;

Hibernate: select person0_.PERSON_ID as PERSON_ID1_1_, person0_.PERSON_NAME as PERSON_NAME2_1_ from PERSON person0_

Hibernate: select drivinglic0_.LICENSE_NUMBER as LICENSE_NUMBER1_0_1_, drivinglic0_.DATE_OF_ISSUE as DATE_OF_ISSUE2_0_1_, drivinglic0_.PERSON_ID as PERSON_ID3_0_1_, person1_.PERSON_ID as PERSON_ID1_1_0_, person1_.PERSON_NAME as PERSON_NAME2_1_0_ from DRIVING_LICENSE drivinglic0_ left outer join PERSON person1_ on drivinglic0_.PERSON_ID=person1_.PERSON_ID where drivinglic0_.PERSON_ID=?

Hibernate: select drivinglic0_.LICENSE_NUMBER as LICENSE_NUMBER1_0_1_, drivinglic0_.DATE_OF_ISSUE as DATE_OF_ISSUE2_0_1_, drivinglic0_.PERSON_ID as PERSON_ID3_0_1_, person1_.PERSON_ID as PERSON_ID1_1_0_, person1_.PERSON_NAME as PERSON_NAME2_1_0_ from DRIVING_LICENSE drivinglic0_ left outer join PERSON person1_ on drivinglic0_.PERSON_ID=person1_.PERSON_ID where drivinglic0_.PERSON_ID=?

Hibernate: select drivinglic0_.LICENSE_NUMBER as LICENSE_NUMBER1_0_1_, drivinglic0_.DATE_OF_ISSUE as DATE_OF_ISSUE2_0_1_, drivinglic0_.PERSON_ID as PERSON_ID3_0_1_, person1_.PERSON_ID as PERSON_ID1_1_0_, person1_.PERSON_NAME as PERSON_NAME2_1_0_ from DRIVING_LICENSE drivinglic0_ left outer join PERSON person1_ on drivinglic0_.PERSON_ID=person1_.PERSON_ID where drivinglic0_.PERSON_ID=?

显然对于获取3行hibernate的4个查询,如何解决这个问题?我在关系方面做错了吗?

更新

现在如果我拿着驾驶执照就像

Query query = entityManager.createQuery("from DrivingLicense dl");

更糟糕的是,7个查询被解雇了.

最佳答案 要拥有JPA供应商独立解决方案,您可以使用以下JPQL查询.

让所有拥有DrivingLicense的人

Query query = entityManager.createQuery("from Person p join fetch p.drivingLicense");

如果他们拥有DrivingLicense,则获得所有人的相关性

Query query = entityManager.createQuery("from Person p left join fetch p.drivingLicense");

或使用Criteria API

CriteriaBuilder criteriaBuilder = em.getCriteriaBuilder();

CriteriaQuery criteriaQuery = criteriaBuilder.createQuery(Person.class);

Root root = criteriaQuery.from(Person.class);

root.fetch("drivingLicense", JoinType.INNER);

criteriaQuery.select(root);

List resultList = em.createQuery(criteriaQuery).getResultList();

RESP.

CriteriaBuilder criteriaBuilder = em.getCriteriaBuilder();

CriteriaQuery criteriaQuery = criteriaBuilder.createQuery(Person.class);

Root root = criteriaQuery.from(Person.class);

root.fetch("drivingLicense", JoinType.LEFT);

criteriaQuery.select(root);

List resultList = em.createQuery(criteriaQuery).getResultList();

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值