jpa,使用非法命名查询的风险?
jpa, risks of using an illegal named query?
我创建了一个可用的 NamedQuery,但我在 Eclipse 中有多个错误标记。现在我的查询可能不合法,一个 told 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 expressions cannot be defined with an identification
下:当前用户:
Input parameters can only be used in the WHERE clause or HAVING clause of a query.
没有它我没能得到我想要的结果。即:
- 获取最新的
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;
}
根据 JPA 2.1 (JavaEE 7),您的查询是正确的 JPQL。 Eclipselink 支持它,如果其他供应商支持 JPA 的 2.1 版本,它们也应该支持。
带有 JOIN 的运算符 ON 是这个最新 JPA 版本的新增功能,它既不存在于 JPA 2.0(JavaEE 6)也不存在于旧的 JPA 1 版本中。
这里有来自 EclipseLink wiki 的更多信息。 wiki 指出 Eclipselink 实现了 ON
运算符并且它在 JPA 2.1 草案中。我还检查了它也在最终的 JPA 2.1 规范中 - 它就在那里。
为了使用您的查询,您只需要确保您的 environment/application 服务器支持 JPA 2.1(例如应用程序服务器应支持 Java EE 7,例如 Glassfish 4 或 WildFly 8+ )
您的 IDE (Eclipse) 在您的查询工作之前发出警告不是问题。 Eclipse 可能不支持 JPA 2.1 语法,或者您的项目必须以某种方式配置为支持 JPA 2.1 而不是旧版本的 JPA。尝试在项目方面查看项目属性,并确保您在版本 2.1
中拥有 JPA
我创建了一个可用的 NamedQuery,但我在 Eclipse 中有多个错误标记。现在我的查询可能不合法,一个
query = "SELECT t FROM Thethread t LEFT JOIN FETCH t.threadVotes tv ON tv.user1=:currentUser ORDER BY t.datePosted DESC"
在下:
JOIN FETCH expressions cannot be defined with an identification
下:当前用户:
Input parameters can only be used in the WHERE clause or HAVING clause of a query.
没有它我没能得到我想要的结果。即:
- 获取最新的
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;
}
根据 JPA 2.1 (JavaEE 7),您的查询是正确的 JPQL。 Eclipselink 支持它,如果其他供应商支持 JPA 的 2.1 版本,它们也应该支持。 带有 JOIN 的运算符 ON 是这个最新 JPA 版本的新增功能,它既不存在于 JPA 2.0(JavaEE 6)也不存在于旧的 JPA 1 版本中。
这里有来自 EclipseLink wiki 的更多信息。 wiki 指出 Eclipselink 实现了 ON
运算符并且它在 JPA 2.1 草案中。我还检查了它也在最终的 JPA 2.1 规范中 - 它就在那里。
为了使用您的查询,您只需要确保您的 environment/application 服务器支持 JPA 2.1(例如应用程序服务器应支持 Java EE 7,例如 Glassfish 4 或 WildFly 8+ )
您的 IDE (Eclipse) 在您的查询工作之前发出警告不是问题。 Eclipse 可能不支持 JPA 2.1 语法,或者您的项目必须以某种方式配置为支持 JPA 2.1 而不是旧版本的 JPA。尝试在项目方面查看项目属性,并确保您在版本 2.1
中拥有 JPA