当前位置: 首页 > 知识库问答 >
问题:

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

秦渝
2023-03-14

我在编写HQL查询时遇到困难,无法从我的案例实体中仅选择案例ID、标题和案例状态字段。返回的病例必须根据病例ID进行区分。我不希望包含名称和用户ID字段。我也不想对caseid、title和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;
}

我的目标是检索一个不同的列表

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

例如,如果my DB包含一个带有列表的大小写

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

        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

更新了问题。而不是名称、标题和列表

我发现了各种线程使用HQL选择集合-Hibernate论坛和使用HQL选择集合-堆栈溢出。这几乎是我遇到的问题。看起来没有人在这些线程中找到解决方案。


共有3个答案

翟嘉祥
2023-03-14

正确的语法应为

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);

返回类型将为列表

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

SELECT cs
FROM Case c JOIN c.cases cs;
白晋鹏
2023-03-14

事实上,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");
嵇财
2023-03-14

Hibernate对查询有点困惑;在HQL中,请这样加入(很抱歉,由于电脑不稳定,我无法在发帖前进行测试,但您应该明白这一点)

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

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

 类似资料:
  • 我应该如何修改.jsp文件上的表单以提交包含不是字符串而是类别的字段的word对象?就整个情况而言,让我展示由提交调用的控制器中的方法: 我有一种感觉,我应该使用@InitBinder方法,但我不知道如何使用,这更像是一种感觉,而不是坚如磐石的事实。欢迎任何建议。

  • 如果标题听起来很模糊,我很抱歉。 我有个目标- 还有这些物品的清单- 我想通过合并具有相同帐户ID的对象来操作这个列表,方法是将vat字段和总计费用字段相加,前提是它们也具有相同的发票日期。 如果两个对象具有相同的帐户ID但不同的发票日期,则它们不应合并。

  • 我有Solr 5.3.1,需要查询除某些字段之外的所有字段(我需要在某些字段中搜索而不是以这种方式检索字段[/?q=query&fl=field1,field2,field3]) 2.[以下解决方案有效,但需要更多时间] 3.我在data-config.xml中设置了indexed=“false”,它只忽略此字段中的搜索,但是当我搜索所有字段http://localhost:8983/solr/t

  • 问题内容: 我有如下所示的Hibernate域对象: 我需要构造一个HQL查询,该查询会向我返回所有至少具有一项附有标记并附有结界的物品的所有玩家的列表。我无法终生想出一种用HQL来表达这一点的方法。 有任何想法吗? 问题答案: 假设以上所有条件都适当,则您要查找的查询是:

  • 我有一个对象的arraylist,其中有一个字段“name”,还有一个名称列表。我必须从列表中选择包含任何名称的所有对象。如何在java中最有效地实现这一点。任何代码片段都将受到高度赞赏。 例子: 让类名为 A由id、name、subject等字段组成。 那么让我们假设我有一个列表 所以假设我有第二个列表 因此,我只想从objectsA列表中选择那些名称字段由名称列表中的名称组成的对象,也就是说,

  • 我在谷歌周围看了一段时间,但没有工作。有谁能帮我解决这个问题吗?