以下是我的代码在这里,我使用多个列表从数据库中获取数据。从hql查询中获取数据时显示异常。
Pojo课
public class BillDetails implements java.io.Serializable {
private Long billNo;
// other fields
@LazyCollection(LazyCollectionOption.FALSE)
private List<BillPaidDetails> billPaidDetailses = new ArrayList<BillPaidDetails>();
private Set productReplacements = new HashSet(0);
@LazyCollection(LazyCollectionOption.FALSE)
private List<BillProduct> billProductList = new ArrayList<BillProduct>();
//getter and setter
}
hmb.xml文件
<class name="iland.hbm.BillDetails" table="bill_details" catalog="retail_shop">
<id name="billNo" type="java.lang.Long">
<column name="bill_no" />
<generator class="identity" />
</id>
<bag name="billProductList" table="bill_product" inverse="true" lazy="false" fetch="join">
<key>
<column name="bill_no" not-null="true" />
</key>
<one-to-many class="iland.hbm.BillProduct" />
</bag>
<bag name="billPaidDetailses" table="bill_paid_details" inverse="true" lazy="false" fetch="select">
<key>
<column name="bill_no" not-null="true" />
</key>
<one-to-many class="iland.hbm.BillPaidDetails" />
</bag>
<set name="productReplacements" table="product_replacement" inverse="true" lazy="false" fetch="join">
<key>
<column name="bill_no" not-null="true" />
</key>
<one-to-many class="iland.hbm.ProductReplacement" />
</set>
</class>
HQL查询
String hql = "select distinct bd,sum(bpds.amount) from BillDetails as bd "
+ "left join fetch bd.customerDetails as cd "
+ "left join fetch bd.billProductList as bpd "
+ "left join fetch bpd.product as pd "
+"left join fetch bd.billPaidDetailses as bpds "
+ "where bd.billNo=:id "
+ "and bd.client.id=:cid ";
我正在尝试以下查询从数据库中获取数据,但这显示了 org.hibernate.loader.MultipleBagFetchException: cannot simultaneously fetch multiple bags
如何解决此问题
这是一个非常常见的问题,所以我决定将答案变成一篇文章。
Hibernate不允许获取一个以上的包,因为这会生成Cartesian。
现在,您会发现很多答案,博客文章,视频或其他资源,它们告诉您对集合使用a Set
代替List
。
那是可怕的建议!
使用Sets
而不是Lists
将MultipleBagFetchException
消失,但笛卡尔积仍将存在。
而不是JOIN FETCH
在单个JPQL或Criteria API查询中使用多个查询:
List<Post> posts = entityManager
.createQuery(
"select p " +
"from Post p " +
"left join fetch p.comments " +
"left join fetch p.tags " +
"where p.id between :minId and :maxId", Post.class)
.setParameter("minId", 1L)
.setParameter("maxId", 50L)
.getResultList();
您可以执行以下技巧:
List<Post> posts = entityManager
.createQuery(
"select distinct p " +
"from Post p " +
"left join fetch p.comments " +
"where p.id between :minId and :maxId ", Post.class)
.setParameter("minId", 1L)
.setParameter("maxId", 50L)
.setHint(QueryHints.PASS_DISTINCT_THROUGH, false)
.getResultList();
posts = entityManager
.createQuery(
"select distinct p " +
"from Post p " +
"left join fetch p.tags t " +
"where p in :posts ", Post.class)
.setParameter("posts", posts)
.setHint(QueryHints.PASS_DISTINCT_THROUGH, false)
.getResultList();
只要您使用最多获取一个集合JOIN FETCH
,就可以了。通过使用多个查询,您将避免使用笛卡尔积,因为除第一个集合外,其他任何集合都是使用辅助查询来获取的。
问题内容: 我们有一个项目,需要延迟加载实体的集合,但是在某些情况下,我们需要热切地加载它们。我们已经为实体添加了注释。在我们的存储库方法中,我们添加了一个“ javax.persistence.loadgraph”提示来热切加载上述注释中定义的4个属性。当我们调用该查询时,Hibernate抛出。 有趣的是,当我重新定义所有这些集合时,Hibernate 确实不 使用MultipleBagFet
问题内容: Hibernate在创建SessionFactory时抛出此异常: org.hibernate.loader.MultipleBagFetchException:无法同时获取多个包 这是我的测试用例: Parent.java Child.java 这个问题怎么样?我能做什么? 编辑 好的,我的问题是另一个“父”实体在我的父内部,我的真实行为是这样的: Parent.java Anoth
问题内容: 在创建时抛出此异常: 无法同时获取多个包 这是我的测试用例: Parent.java 这个问题怎么样?我能做什么? 编辑 好的,我的问题是另一个“父”实体在我的父内部,我的真实行为是这样的: Parent.java AnotherParent.java Hibernate不喜欢带有的两个集合FetchType.EAGER,但这似乎是一个错误,我没有做不寻常的事情… FetchType.
我有以下实体 注册程序 教练 官方 基本上,我有与(Trainer-Register steredProgram,官方注册程序)有多对一关系的实体。现在我有一个服务已经满足了我的要求,通过id获取注册程序,我应该只包含所有的和与isDeletedfalse。请参阅下面的服务: 服务 现在,我尝试使用< code>@Query和< code>@EntityGraph,这样我就可以只使用一个查询就获得
我想点击类id为clsArrowClick的锚标记,并且相同的id在另一个锚标记上。 我尝试了list、wait方法和simple way方法,但我的程序在线程“main”org.openqa.selenium.ElementNotVisibleException中抛出了一个错误异常 就像 //WebDriverWait wait=new WebDriverWait(驱动程序,30);//wait
无效数据访问设备别名:org.hibernate.loader.多个包取出异常:无法同时获取多个包: [订单项, 订单项选项]; 上面是我加入下面三个表时遇到的一个例外。 OrderItemOption.java 订单项.java 订单.java 这是我一次性加入它们的QueryDSL代码。 我想做的是获得包含过滤关系的order对象,这样我就可以通过Order对象访问过滤的子对象。并且关系的类型