如何 return 标准不同的结果
how to return criteria Distinct Result
我和 Bill 以及 Bill_Details 有 onetomany 和 manytoone 关系。我需要帮助获取账单列表。
波乔
比尔
@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;
我正在使用投影从列表中获取账单值。
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();
}
注:
--> 账单 table 包含单行
--> BillDetails table 包含此 BillId
的四行
我的条件查询 Returns 四个对象而不是单个对象。我也尝试了不同的功能。
预期输出:
我需要包含 BillDetails 对象(4 个值)的单个对象。
ie.I 用下面的示例 Json 格式解释
{billNo:231,
billDetails[{amount:100,rate:1}{amount:200,rate:2}
{amount:300,rate:30}{amount:400,rate:4}] }
如何通过Hibernate criteria Query得到这个?请帮忙
首先,您的映射不正确。你有一个双向关联,其中一个边(the one side)必须是一个边的逆:
@OneToMany(mappedBy = "billId", cascade = CascadeType.ALL, fetch = FetchType.EAGER)
private Set<BillDetails> billDetails = new HashSet<BillDetails>();
您还应该将字段 billId 重命名为 bill,因为它包含的是账单,而不是账单 ID。
现在,您查询的问题是您无缘无故地使用投影。使用投影时,您有意选择 return 包含各个列的行。由于 SQL 查询 returns 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
我和 Bill 以及 Bill_Details 有 onetomany 和 manytoone 关系。我需要帮助获取账单列表。
波乔
比尔
@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;
我正在使用投影从列表中获取账单值。
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();
}
注:
--> 账单 table 包含单行
--> BillDetails table 包含此 BillId
的四行我的条件查询 Returns 四个对象而不是单个对象。我也尝试了不同的功能。
预期输出:
我需要包含 BillDetails 对象(4 个值)的单个对象。 ie.I 用下面的示例 Json 格式解释
{billNo:231,
billDetails[{amount:100,rate:1}{amount:200,rate:2}
{amount:300,rate:30}{amount:400,rate:4}] }
如何通过Hibernate criteria Query得到这个?请帮忙
首先,您的映射不正确。你有一个双向关联,其中一个边(the one side)必须是一个边的逆:
@OneToMany(mappedBy = "billId", cascade = CascadeType.ALL, fetch = FetchType.EAGER)
private Set<BillDetails> billDetails = new HashSet<BillDetails>();
您还应该将字段 billId 重命名为 bill,因为它包含的是账单,而不是账单 ID。
现在,您查询的问题是您无缘无故地使用投影。使用投影时,您有意选择 return 包含各个列的行。由于 SQL 查询 returns 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