さて、いくつかのテーブルがあります
- 投票
- コンテスト
- コンテスト部門
- コンテスト登録
- 提出可能
- ユーザー
この関係は、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にかなり慣れていないので、あなたが提供できる助けは素晴らしいでしょう! ありがとう!