java - HQL:当其中一个字段是一对多列表时,如何查询某些字段?

标签 java hibernate hql

我很难编写 HQL 查询来仅选择 caseid , title , 和 caseStatus来 self 的字段 Cases实体。返回的案例必须基于 caseid 不同。我不想要 nameuserid要包含的字段。我也不想对 caseid 使用延迟获取, title , 和 caseStatus领域。请注意 caseStatus字段是一个一对多的列表。以下是实体。省略了 getter/setter 以节省空间。

@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;
}

我的目标是检索一个不同的 List<Cases>List<Object[]>仅包含 caseid 的案例实体, title , 和一个 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;
}

上述方法很接近,但不正确,因为它没有返回 List<CaseStatus>。在其中一个索引中,它只返回一个 CaseStatus实体。

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

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

        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

更新了问题。而不是 name , title , 和 List<CaseStatus> ,我要检索的字段是 caseid , title , 和 List<CaseStatus> . caseid是Cases的主键。

我发现了各种线程 Select Collections with HQL - hibernate forumSelect collections with HQL - stackoverflow .这几乎是我遇到的问题。看起来没有人在这些线程中找到解决方案。

最佳答案

Hibernates 对查询有点困惑;在 HQL 中像这样加入(抱歉,由于计算机不稳定,我无法在发布前进行测试,但你应该明白了)

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

“获取”使其变得急切。请注意,这将返回一个 Cases 类型的数组。您的 where 子句看起来是正确的。

关于java - HQL:当其中一个字段是一对多列表时,如何查询某些字段?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45044108/

相关文章:

java - HQL 多个 where 子句

java - Android JavascriptInterface api 17以下漏洞解决

java - sql 查询在 Hibernate 中很慢,在 mysql 上很快

java - 为什么 CTE 查询在 Hibernate 中不起作用?

Nhibernate:二级集合中的不同结果

java - 使用 HQL 时出现 ClassCastException

java - Eclipse:Java 应用程序大小

java - 在调用代码中捕获 Feign 客户端的错误状态并向上游报告错误

java - 将 Jersey 输入流解析为 JacksonObject

spring - org.hibernate.HibernateException : No CurrentSessionContext configured