jpa,使用非法命名查询的风险?

时间:2015-09-21 21:52:52

标签: java jpa persistence jpql

我制作了一个有效的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;
    }

1 个答案:

答案 0 :(得分:2)

根据JPA 2.1(JavaEE 7),您的查询是正确的JPQL。如果他们支持2.1版本的JPA,Eclipselink也支持它和其他提供商。 使用JOIN的操作员ON是最新的JPA版本,它既不存在于JPA 2.0(JavaEE 6)中,也不存在于较旧的JPA 1版本中。

以下是来自EclipseLink 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