如何返回条件Distinct Result



我有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

最新更新