如何 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