0

さて、いくつかのテーブルがあります

  • 投票
  • コンテスト
  • コンテスト部門
  • コンテスト登録
  • 提出可能
  • ユーザー

この関係は、Contest に関連付けられている ContestSegment に関連付けられている ContestRegistration を作成することによって、Submittable をコンテストに送信できるということです。

投票には、ユーザーと、投票が関連する ContestRegistration への参照があります。

ものすごく単純。

ここでのアイデアは、コンテストの ContestRegistrations の 1 つに既に投票したかどうかを確認する 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;
}

しかし、私が戻ったときは、何をプラグインしても、常に真の支持を得ています (つまり、すでに投票したことを意味します)。たとえば、コンテスト #1 には投票しましたが、コンテスト #2 には投票していません。コンテスト 2 の値を差し込むと、それでも true が返されます。私は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 に答える