【发布时间】:2017-12-16 01:55:59
【问题描述】:
我在编写 HQL 查询以从我的 Cases 实体中仅选择 caseid、title 和 caseStatus 字段时遇到困难。返回的案例必须根据 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;
}
我的目标是检索仅包含 caseid、title 和 List<CaseStatus> 的 Cases 实体的不同 List<Cases> 或 List<Object[]>。 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 和一个大小为 n 的 List<CaseStatus>,则结果将类似于以下示例:
我现在得到的结果示例。不正确:
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。这几乎是我遇到的问题。似乎没有人在这些线程中找到解决方案。
【问题讨论】:
-
你能发布生成的 SQL 查询吗?
-
查看错误消息,它说“由:com.microsoft.sqlserver.jdbc.SQLServerException:关键字'as'附近的语法不正确。” ,我在您的查询中没有看到任何“as”关键字,您是否发布了正确的查询?
-
它是 HQL,hibernate 生成的查询是你会发现有问题的“as”的地方。如果您在休眠配置中将 org.hibernate.cfg.AvailableSettings.SHOW_SQL(或“hibernate.show_sql”)设置为 true 并将日志记录设置为调试,则可以看到这一点。
-
将生成的 SQL 查询从日志记录添加到原始帖子。我注意到 .因为 col_2_0 可能会导致错误。我想知道为什么我写的 HQL 会导致这种情况。
-
如果你问的是
HQL,为什么要使用JPA?HQL与JPA无关,因此请从您的标签列表中删除JPA。如果你的意思是JPA查询,那么在select列表中使用集合值属性是非法的。