我有Bill和Bill_Details,它们有一个女人和一对一的关系。我需要人帮我拿比尔名单。
Pojo
票据
@OneToMany(cascade={CascadeType.ALL},fetch = FetchType.EAGER)
@JoinColumn(name = "bill_id")
private Set<BillDetails> billDetails = new HashSet<BillDetails>();
账单详细信息
@ManyToOne(cascade = { CascadeType.ALL }, fetch = FetchType.EAGER)
@JoinColumn(name = "bill_id")
private Bill billId;
我正在使用投影从列表中获取Bill值。
DaoHibernate
@Transactional
public List<Bill> getbillDetailsByBillId(String billId) {
Criteria cr = null;
try {
cr = getSession().createCriteria(Bill.class,"bill")
.createAlias("bill.billDetails","billDetails")
.setProjection(Projections.projectionList()
// I tried .setProjectionProjections.distinct(Projections.projectionList()
.add(Projections.property("billNo"),"billNo")
.add(Projections.property("billDetails.amount"),"billDetails.amount")
.add(Projections.property("billDetails.rate"),"billDetails.rate"))
.add(Restrictions.eq("id", billId))
.setResultTransformer(new AliasToBeanNestedResultTransformer(Bill.class));
} catch (Exception e) {
System.out.println("Get bill DetailsByBillId Error----------"+e);
e.printStackTrace();
}
System.out.println(cr.list().size());
return cr.list();
}
注意:
-->票据表包含单行
-->BillDetails表包含此BillId 的四行
我的条件Query返回四个对象,而不是单个对象。我也尝试了与众不同的特色。
预期输出:
我需要一个包含BillDetails对象(4个值)的对象。即,我在下面用Json格式示例进行了解释
{billNo:231,
billDetails[{amount:100,rate:1}{amount:200,rate:2}
{amount:300,rate:30}{amount:400,rate:4}] }
如何通过Hibernate条件查询得到这个?请帮助
首先,您的映射不正确。你有一个双向关联,其中一侧(一侧)必须是一侧的倒数:
@OneToMany(mappedBy = "billId", cascade = CascadeType.ALL, fetch = FetchType.EAGER)
private Set<BillDetails> billDetails = new HashSet<BillDetails>();
您还应该将字段billId重命名为bill,因为它包含的是账单,而不是账单ID。
现在,您的查询的问题是您毫无理由地使用投影。使用投影时,您会故意选择返回包含单个列的行。由于SQL查询返回4行,因此您将返回4张账单:每行一张。
使用Criteria查询而不是HQL也会使您的生活变得不必要的复杂,因为HQL更适合这种简单的静态查询。
但在这里,即使是HQL查询也没有用,因为你只想从它的ID中获得账单。你只需要
Bill bill = (Bill) session.get(Bill.class, billId);
这将获得账单,由于您选择将OneToMany关联设置为EAGER,它也将立即加载其账单详细信息。
如果你没有创建EAGER关联(你真的应该把它作为LAZY),你可以使用这个简单的HQL查询来加载一个包含其详细信息的账单:
select distinct b from Bill bill
left join fetch bill.billDetails
where bill.id = :billId