gpt4 book ai didi

java - 如何返回条件不同的结果

转载 作者:行者123 更新时间:2023-11-30 11:05:35 26 4
gpt4 key购买 nike

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

我正在使用投影从列表中获取账单值。

道 hibernate

@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 的四行

我的条件查询返回四个对象而不是单个对象。我也尝试了不同的功能。

预期输出:

我需要包含 BillDetails 对象(4 个值)的单个对象。即,我在下面用示例 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。

现在,您的查询存在的问题是您无缘无故地使用投影。使用投影时,您有意选择返回包含各个列的行。由于 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

关于java - 如何返回条件不同的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29607633/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com