0

好的,所以我有几张桌子

  • 投票
  • 比赛
  • 比赛环节
  • 比赛报名
  • 可提交
  • 用户

关系是可以通过创建与 ContestSegment 相关联的 ContestRegistration 将 Submittable 提交给竞赛,该 ContestSegment 与 Contest 相关联。

投票具有用户和对投票相关的 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;
}

但是当我回来时,无论我插入什么,我总是得到一个真正的支持(意味着我已经投票了)。例如,我对竞赛#1 进行了投票,但我没有对竞赛#2 进行投票。如果我插入竞赛#2 的值,那么我仍然会得到真正的回报。我对 JPQL 还很陌生,所以你能提供的任何帮助都会很棒!谢谢!

4

2 回答 2

0

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

于 2012-06-26T16:28:32.197 回答
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
于 2012-06-26T16:33:59.697 回答