我很难编写 HQL 查询来仅选择 caseid
, title
, 和 caseStatus
来 self 的字段 Cases
实体。返回的案例必须基于 caseid 不同。我不想要 name
和 userid
要包含的字段。我也不想对 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
实体。
例如,如果我的数据库包含单个 Case
用List<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 forum和 Select 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/