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

标签 java hibernate annotations projection hibernate-criteria

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

相关文章:

java - Criteria.list() 以 BatchUpdateException : Data truncation 结尾

pdf - 如何将文本对象添加到现有的pdf

java - 无法运行 Apache James

java - 使用 Spring Mvc 的 REST 请求上的 HTTP 400 错误请求

java - 如何将 jdk-8u74-linux-x64.rpm 转换为 1.8.0_74 以检查 java 版本?

java - 如何在 Hibernate 中执行非多态 HQL 查询?

java - 如何避免 IntelliJ 中可嵌入类的验证错误 "Cannot resolve column ' xy'"?

spring - 从 Spring 3 注释生成完整的 XML 配置

c# - 接口(interface)注解

java - 测试预期异常时出错,即使它抛出正确的异常