将表连接到实体

时间:2015-08-04 16:38:15

标签: jpa left-join jpql

我想在实体中获取此SQL查询的结果:

SELECT * FROM thethreads t
LEFT JOIN thread_votes tv
ON t.idthread=tv.thread
AND tv.from_user like "currentUser";

请注意,联接的结果不是我的线程表的一部分:

enter image description here

我试过这个:

private static final String SELECT_NEWEST_THREADS = "Select t From Thethread t LEFT JOIN FETCH t.threadcurrentUserVote tv WHERE tv.user1=:currentUser ORDER BY t.datePosted";

我已将此添加到我的Thethread实体(我的表中不是列):

@OneToOne
private ThreadVote threadcurrentUserVote;

但我收到错误:Unknown column 't1.THREADCURRENTUSERVOTE_id_votes_thread' in 'field list'

目的是查看访问某个帖子的用户是否已经投票。

1 个答案:

答案 0 :(得分:1)

如果我理解得很好,那么每个Thethdread都有很多ThreadVote,并且您正试图找出是否存在来自已知用户的线程投票。

因此,不要定义您提到的一对一,而是将其添加到ThreadVote实体

@ManyToOne
@JoinColumn(name="thread")
 private Thethread thread;

假设您有一个关联ThreadVote - >名为user1的用户代表 from_user 。下一个查询获取由当前用户

投票的thdreads
select t
from ThreadVote tv join  tv.thread t 
where tv.user1 = :currentUser 
order by t.datePosted

修改

我有点懒,但您也可以将下一个映射添加到Thethread实体中以使关联双向     @OneToMany(的mappedBy = “线程”)     私人投票;

然后下一个查询得到一对thdread和一个指示当前用户是否已投票选择了该线程的vaule

select t, 
  case
    when ( tv is not empty and :currentUser in tv.user1 ) then TRUE
    else FALSE
  end
from Thethread t left outer join t.votes tv
order by t.datePosted

我不确定何时的条件表达式是否正确,因为它使用了收集路径。如果它导致任何问题,您可以用一些有用的子查询替换它