【问题标题】:jpa, risks of using an illegal named query?jpa,使用非法命名查询的风险?
【发布时间】: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


【解决方案1】:

根据 JPA 2.1 (JavaEE 7),您的查询是正确的 JPQL。 Eclipselink 支持它,其他提供者也应该支持,如果它们支持 2.1 版本的 JPA。 带有 JOIN 的运算符 ON 是最新 JPA 版本的新功能,它既不存在于 JPA 2.0 (JavaEE 6) 中,也不存在于较旧的 JPA 1 版本中。

这里是来自EclipseLink wiki 的更多信息。 wiki 声明 Eclipselink 实现了ON 运算符,并且它在 JPA 2.1 草案中。我还检查了它也在最终的 JPA 2.1 规范中 - 它就在那里。

为了使用您的查询,您只需要确保您的环境/应用服务器支持 JPA 2.1(例如应用服务器应该支持 Java EE 7,例如 Glassfish 4 或 WildFly 8+)

在您的查询有效之前,您的 IDE (Eclipse) 会发出警告,这不是问题。 Eclipse 可能不支持 JPA 2.1 语法,或者您的项目必须以某种方式配置为支持 JPA 2.1 而不是旧版本的 JPA。尝试在项目方面下查看项目属性,并确保您在 2.1 版中具有 JPA

【讨论】:

  • 再次感谢您的宝贵时间。我必须说这个 ON 运算符非常有用,所以我很高兴你也学到了一些有价值的东西。干杯。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-02
  • 1970-01-01
相关资源
最近更新 更多