如何在JPQL中创建一个使用隐式连接查询两个表的TypedQuery?

问题描述 投票:1回答:1

我正在尝试学习如何在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();
}

如上所示,我试图访问“User”表中的“height”属性: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;
java rest jpa jpql derby
1个回答
1
投票

问题是这部分:

r.userId.height

为了实现这一点,userId必须是一个实体。您可以在user中定义与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;
© www.soinside.com 2019 - 2024. All rights reserved.