JPQL结果不是我想要的

时间:2012-06-17 18:16:32

标签: jpql

好的,我有几张桌子

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

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

投票有一个用户和对投票所涉及的竞赛注册的引用。

非常简单。

现在,我的想法是,我想点击一个RESTful服务,检查我是否已经参加了竞赛中的一个竞赛注册。

除了理想的结果外,一切正常。

我正在运行的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很新,所以你能提供的任何帮助都很棒!谢谢!

2 个答案:

答案 0 :(得分:0)

在JPQL中使用左连接时,除非比赛不存在,否则它将返回true。听起来像csr.votes应该是正常的连接。

答案 1 :(得分: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