java - 如何在 JPQL 中创建使用隐式连接查询两个表的 TypedQuery?
问题描述
我正在尝试学习如何在 JPQL 中使用隐式连接。我正在使用的一个示例似乎表明可以将外键作为路径引用,然后可以访问外键引用的表中的属性。
这是用户和报告之间的 1:M 强制关系。userId 是引用 User 的外键。
我检查了我是否导入了正确的库,我有正确的映射(@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;
解决方案
问题是这部分:
r.userId.height
为了使它工作,userId
必须是一个实体。您可以定义与user
字段 in的关系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;
进入:
@JoinColumn(name = "USER_ID")
@ManyToOne(optional = false)
@Basic(optional = false)
@NotNull
private User user;
推荐阅读
- redis - 启用持久性的 Redis-HA helm chart 同步问题
- postgresql - 尝试恢复 Sonarqube 数据库后 PostgreSQL 错误“关系不存在”
- ios - Swift 5反射获取类属性列表并调用它们
- java - 我们可以为 Kafka Producer 分配源端口吗?
- python - 类型错误:edit_undo() 接受 1 个位置参数,但给出了 2 个
- java - Java 14 中的 Lambda 表达式和“?:”运算符
- python - Pygame Sprite 在移动时会留下痕迹
- javascript - 使用 ES lint 错误希望在不禁用它或更改规则的情况下解决
- azure - azure webapp 您无权查看此目录或页面
- amazon-web-services - AWS SES 允许跟踪邮件是否发送或失败