【发布时间】:2015-12-18 17:40:23
【问题描述】:
我创建了一个有效的 NamedQuery,但我在 Eclipse 中有多个错误标记。现在我的查询可能不合法,answer of so (see comments) 告诉me it wasn't possible 做我打算在 jpa 中做的事情。所以,既然我还是设法做到了,我真的不知道它为什么会起作用:我的问题是使用它的潜在风险是什么:
query = "SELECT t FROM Thethread t LEFT JOIN FETCH t.threadVotes tv ON tv.user1=:currentUser ORDER BY t.datePosted DESC"
下:
JOIN FETCH 表达式不能用标识定义
在:currentUser:下
输入参数只能用在查询的 WHERE 子句或 HAVING 子句中。
没有它,我无法获得我想要的结果。这是:
- 获取最新的
Thethread - 仅获取其收藏中的当前用户投票。
如果你知道怎么做,请做我的客人。
实体是这样的:
public class Thethread implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private long idthread;
@Temporal(TemporalType.TIMESTAMP)
@Column(name = "date_posted")
private Date datePosted;
private int downvotes;
private int upvotes;
// bi-directional many-to-one association to ThreadVote
@OneToMany(mappedBy = "thethread")
private List<ThreadVote> threadVotes;
}
public class ThreadVote implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@Column(name = "id_votes_thread")
private int idVotesThread;
private int vote;
// bi-directional many-to-one association to Thethread
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "thread")
private Thethread thethread;
// bi-directional many-to-one association to User
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "from_user")
private User user1;
}
【问题讨论】:
-
你的持久化提供者是什么?如果您使用的是休眠,那么如果您编写的查询不是合法的 JPQL 但合法的 HQL,那么它在运行时可以正常工作,直到您尝试切换到不同的 JPA 实现。我个人不知道 EclipseLink 是否还支持更多不在 JPA 规范中的查询功能。
-
@Affe 我没有使用休眠。我正在使用来自 Eclipse 的标准持久性提供程序,据我所知是 EclipseLink。我想我会在这个用例中使用 jdbc,因为这显然不是 JPA 的意图。我今天阅读了 jdbc 的文档(那年我还是个新手,我从 jpa 开始),但与 jpa 的做法相比,我还不确定我必须在哪里打开连接等等。
-
Google 告诉我 eclipselink 也有自己的一组查询扩展功能。所以,同样的风险。例如,如果您将它部署在开箱即用的 weblogic 上,并且它尝试使用 toplink,它可能会停止工作。 (也有可能你的 IDE 被你在某处设置的东西弄糊涂了,即使你的运行时是 JPA2,它也在验证 JPA1)
标签: java jpa persistence jpql