我正在尝试学习如何在JPQL中使用隐式联接。我正在研究的一个示例似乎建议人们可以将外键引用为路径,然后可以访问表中外键引用的属性。
这是用户和报告之间的1:M强制性关系。 userId是引用用户的外键。
我检查了是否导入了具有正确映射的正确库(@ JoinColumn,@ ManyToOne,@ OneToMany,mappedBy等),一切似乎都还可以。
@GET
@Path("findByTotalCalBurnedAndHeight/{height}/{totalCalBurned}")
@Produces({"application/json"})
public List<Report> findByTotalCalBurnedAndHeight(@PathParam("height") Integer height, @PathParam("totalCalBurned") Integer totalCalBurned) {
TypedQuery<Report> q = em.createQuery("SELECT r FROM Report r WHERE r.totalCalBurned = :totalCalBurned AND r.userId.height = :height", Report.class);
q.setParameter("height", height);
q.setParameter("totalCalBurned", totalCalBurned);
return q.getResultList();
}
如上所示,我正在尝试通过以下方式访问“用户”表中的“高度”属性:r.UserId.height
基于我正在工作的示例,我希望联接在这里起作用,但是我得到的结果是此错误:“状态字段路径'r.userId.height'无法解析为有效类型。”
我在这里错过了什么吗?任何反馈都非常感谢。
更新以显示映射:
在报告类别中:
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Basic(optional = false)
@Column(name = "REPORT_ID")
private Integer reportId;
@JoinColumn(name = "USER_ID", referencedColumnName = "USER_ID")
@ManyToOne(optional = false)
@Basic(optional = false)
@NotNull
@Column(name = "USER_ID")
private Integer userId;
在用户类别中:
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Basic(optional = false)
@Column(name = "USER_ID")
private Integer userId;
@OneToMany(cascade = CascadeType.ALL, mappedBy = "userId")
@Basic(optional = false)
@NotNull
@Column(name = "HEIGHT")
private int height;
答案 0 :(得分:1)
问题是这部分:
r.userId.height
要使其正常工作,userId
必须是一个实体。您可以在user
的{{1}}字段中定义一种关系,并编写如下内容:
Report
编辑-更改此内容
"SELECT r FROM Report r left join r.user u WHERE r.totalCalBurned = :totalCalBurned AND u.height = :height"
进入:
@JoinColumn(name = "USER_ID", referencedColumnName = "USER_ID")
@ManyToOne(optional = false)
@Basic(optional = false)
@NotNull
@Column(name = "USER_ID")
private Integer userId;