使用Hibernate我有以下查询JPQL加盟,where子句有意想不到的效果
String PQ = "select k from Customer k inner join k.winterSet vs where vs.year = :year";
TypedQuery<Customer> tq = legacyEm.createQuery(PQ,Customer.class);
tq.setParameter("year", DateUtil.getCurrentWinterSeason());
List<Customer> result = tq.getResultList();
在客户的映射
@OneToMany(fetch = FetchType.LAZY, mappedBy = "customer")
private Set<Winter> winterSet = new HashSet<>(0);
,并在冬季
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "cnr")
private Customer customer;
当我运行这个查询我只从Customer中得到实际上在Winter中具有与该gi匹配的属性年的相关行的行ven参数。到现在为止还挺好。但是,这些Customer对象的WinterSet中填充了所有相关的Winter对象,而不仅仅是年份属性中具有所需值的那些对象。我怎样才能做到这一点?
事实证明,幸运的是有一种方法。否则,在我看来,jpa会非常适得其反。在查询中使用“连接获取”而不是“连接”会有诀窍。 – 2012-01-02 07:45:28
它的工作原理,但只与休眠。 JPA通常不允许限制获取的实体。这确实非常危险,因为如果你修改了部分加载的集合,Hibernate会触发一个更新,并且可以很好地移除所有链接并重新创建它们,从而删除所有未加载实体的链接。 – 2012-01-02 08:05:40
所以,实际上你说的是在EclipseLink或OpenJPA中运行fetch连接查询,检索到的对象集与Hibernate产生的不同?修改结果并不是必须的,但的确如此,也要感谢这个警告,在Hibernate中,获取连接看起来本质上是危险的......实际上没有安全和有效的方式来实现我想要的JPA吗?如果我只想要相关集合中的某个对象,我是否真的需要加载所有对象,只是将它们中的n-1扔掉? – 2012-01-02 09:31:06