繁体   English   中英

HQL:当这些字段之一是一对多列表时,如何查询某些字段?

[英]HQL: How to query certain fields when one of those fields is a one-to-many List?

我在编写HQL查询以caseStatus Cases实体中选择caseidtitlecaseStatus字段时遇到困难。 返回的案例必须根据caseid是不同的。 我不希望包含nameuserid字段。 我也不想对caseidtitlecaseStatus字段使用惰性抓取。 请注意, caseStatus字段是一对多列表。 以下是实体。 为了节省空间,省略了吸气剂/吸气剂。

@Entity
@Table(name = "Cases")
public class Cases {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "caseid", nullable = false)
    private Integer caseid;
    private Integer userid;
    private String name;
    private String title;
    @OrderBy("caseStatusId DESC")
    @OneToMany(mappedBy = "cases", fetch = FetchType.EAGER)
    private List<CaseStatus> caseStatus;
}

@Entity
@Table(name = "CaseStatus")
public class CaseStatus {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "caseStatusId", nullable = false)
    private Integer caseStatusId;
    private String info;
    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "caseid")
    private Cases cases;
}

我的目标是检索仅包含caseidtitleList<CaseStatus>的Cases实体的不同List<Cases>List<Object[]> List<CaseStatus> List<CaseStatus>将包含CaseStatus对象,并填充其所有字段。

public List<Object[]> getCases(String title) {
    TypedQuery<Object[]> q = em.createQuery("select distinct c.caseid, c.title, cs "
        + "FROM Cases c join c.caseStatus cs "
        + "where c.title like :title", Object[].class);
    q.setParameter("title", "%" + title + "%");
    List<Object[]> results = q.getResultList();
    return results;
}

上面的方法很接近,但是不正确,因为它只返回一个CaseStatus实体,而不是在其中一个索引中返回List<CaseStatus>

例如,如果我的数据库包含一个大小为n的List<CaseStatus>的单个Case ,则结果将类似于以下示例:

我现在得到的结果示例。 不正确:

        List<Object[]> index 0:
            Contains an Object[] where:
                Object[0] = {some caseid}
                Object[1] = {some title}
                Object[2] = {1st CaseStatus}
        List<Object[]> index 1:
            Contains an Object[] where:
                Object[0] = {same caseid as the one found in index 0 above}
                Object[1] = {same title as the one found in index 0 above}
                Object[2] = {2nd CaseStatus}
        ...
        List<Object[]> index n-1:
            Contains an Object[] where:
                Object[0] = {same caseid as all the previous}
                Object[1] = {same title as all the previous}
                Object[2] = {nth CaseStatus}

我希望达到的结果示例:

        List<Object[]> index 0:
            Contains an Object[] where:
                Object[0] = {unique caseid}
                Object[1] = {some title}
                Object[2] = List<CaseStatus> with size of n

更新了问题。 取而代之的nametitleList<CaseStatus>我要检索的字段caseidtitleList<CaseStatus> caseid是Cases的主键。

我在HQL-hibernate论坛中找到了多个线程Select Collections, 在HQL-stackoverflow中找到了Select Collections 这几乎是我遇到的问题。 似乎没人在这些线程中找到解决方案。

休眠使查询有些混乱; 在HQL中进行这样的加入(不好意思,由于计算机运行缓慢,我无法在发布前进行测试,但您应该有个主意)

select distinct c from Cases c left join fetch c.caseStatus cs where....

“获取”使它渴望。 请注意,这将返回Cases类型的数组。 您的where子句看起来正确。

实际上,HQL是完全面向对象的,并在查询中使用您的类结构,因此通过编写c.caseStatus HQL希望您的Cases类具有caseStatus属性,这是错误的,因为它是一个集合。

如果查看Hibernate HQL文档,您会看到:

但是,与SQL相比,HQL 完全面向对象,并且了解诸如继承,多态性和关联之类的概念。

我认为您需要在此处更改查询,使其与您的类结构匹配:

    Query q = em.createQuery("select distinct c.name, c.title, cs.caseStatus FROM Cases c left join c.caseStatus where "
        + "c.name like :name and "
        + "c.title like :title");

正确的语法应该是

TypedQuery<Object[]> q = em.createQuery("select c.name, c.title, cs FROM Cases c "
                + "join c.caseStatus cs where "
                + "c.name = :name and "
                + "c.title = :title", Object[].class);

返回类型将是List<Object[]>其中,在第一索引Object[]是c.name,第二是c.title和第三关联caseStatus实体。 可以查询多个实例(行)。

我们需要JOIN,因为CaseStatus和Case之间的关系是通过集合映射的。

SELECT cs
FROM Case c JOIN c.cases cs;

你为什么不只用

Query q = em.createQuery("select distinct c from Cases c where "
            + "c.name like :name and "
            + "c.title like :title");

尝试一下。 这可能是幼稚的方法,但应该能够解决问题。 您可能获得的字段超出了您的要求,但返回类型将是“案例”列表。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM