2012-06-17 69 views
0

好了,所以我有几个表JPQL结果不是我想要的

  • 投票
  • 大赛
  • ContestSegment
  • ContestRegistration
  • Submittable
  • 用户

的关系髋关节是可以通过创建比赛注册将提交表提交给比赛,该比赛注册与比赛相关联的比赛段相关联。

表决具有用户和到ContestRegistration该投票涉及一种参考。

很简单。现在

,这个想法是,我想打一个RESTful服务,检查,看看是否我已经表决比赛中的ContestRegistrations之一。

一切工作除了期望的结果。

我快看起来像这样JPQL:

SELECT DISTINCT v 
FROM Vote v, Contest c 
JOIN v.user vu 
LEFT JOIN c.segments cs 
LEFT JOIN cs.registrations csr 
LEFT JOIN csr.votes csrv 
WHERE vu.id = :userId 
AND cs.beginDate < CURRENT_TIMESTAMP 
AND cs.endDate > CURRENT_TIMESTAMP 
AND c.id = :contestId 

的方法是这样的:

public Boolean hasUserVoted(User user, Contest contest){ 
    StringBuffer query = new StringBuffer() 
    .append("SELECT DISTINCT v from Vote v, Contest c ") 
    .append("JOIN v.user vu LEFT JOIN c.segments cs LEFT JOIN cs.registrations csr LEFT JOIN csr.votes csrv ") 

    .append("WHERE vu.id = :userId ") 
    .append(" ") 
    .append("AND cs.beginDate < CURRENT_TIMESTAMP AND cs.endDate > CURRENT_TIMESTAMP AND c.id = :contestId "); 
    Boolean hasVoted = true; 
    try{ 
    Vote vote = (Vote)entityManager.createQuery(query.toString()) 
     .setParameter("userId", user.getId()) 
     .setParameter("contestId", contest.getId()).getSingleResult(); 
    }catch(NoResultException nre){ 
     hasVoted = false; 
    } 

    return hasVoted; 
} 

但是,当我回来,不管我插上,我总是获得真正的回报(意味着我已经投了票)。例如,我已经参加了第一场比赛的投票,但是我没有投票参加第二场比赛。如果我插入比赛#2的价值,那么我仍然会得到真正的回报。我对JPQL相当陌生,所以你提供的任何帮助都会很棒!谢谢!

回答

0

通过使用左边的你JPQL连接,除非比赛不存在,它将返回true。它的声音像csr.votes应该是一个正常的连接。

+0

这做到了。谢谢! –

0

你没有连接与较量表决任何限制。我觉得您的查询应该是:

SELECT DISTINCT v 
FROM Contest c 
JOIN c.segments cs 
JOIN cs.registrations csr 
JOIN csr.votes csrv 
JOIN csrv.user vu 
WHERE vu.id = :userId 
AND cs.beginDate < CURRENT_TIMESTAMP 
AND cs.endDate > CURRENT_TIMESTAMP 
AND c.id = :contestId