web-dev-qa-db-ja.com

名前付きクエリを呼び出す方法

名前付きクエリをエンティティクラスの投票者で記述しました

NamedQuery(name = "Voter.findvoter", query = "SELECT count(*) FROM Voter v WHERE v.voterID = :voterID" and where v.password= : password),

この名前付きクエリを呼び出したいのですが、voterIDとパスワードも設定する必要があります。

手伝って頂けますか。ありがとうございました

20
sandeep

NamedQueryアノテーションの@記号を見逃したと思いますか?

コードでは、次のように呼び出します。

List results = em.createNamedQuery("Voter.findvoter")
    .setParameter("voterID", "blah")
    .setParameter("password","blahblahblah")
    .getResultList();
38

名前付きクエリには、問題を引き起こす2つの明らかな問題があります。

  • これは注釈なので、NamedQueryだけではなく_@NamedQuery_にする必要があります
  • あなたのクエリは現在:

query = "SELECT count(*) FROM Voter v WHERE v.voterID = :voterID" and where v.password= : password

問題は、_:voterID_の後ではなく_:password_の後に文字列を終了すると、 "where"が2回あり、 ":"と "password"の間にスペースがあることです。クエリは次のようになります。

query = "SELECT count(*) FROM Voter v WHERE v.voterID = :voterID and v.password= :password"

(「を最後に移動し、2番目の「場所」と「:」の後のスペースを削除したところです。)

4
brent777

一般的な手順は(名前付きクエリまたはその他)

  1. クエリを作成する-emには5つのcreateメソッドがあります。
  2. 必要に応じて、パラメータを使用してクエリを設定します。クエリインターフェースにはこれらのメソッドがあります。
  3. クエリを実行する-クエリインターフェースには、3つの実行関連メソッドがあります。

上記の3つの手順で、任意のJPAクエリを実行できます。

2
OpenSource

実際、brentは正しいです。NameQueryは次のようになります。

@NamedQuery(name = "Voter.findvoter", query = "SELECT count(*) FROM Voter v WHERE v.voterID = :voterID AND where v.password = :password")
@Entity
public class Voter implements Serializable{ ... }

そして他のどこかでこれを試すべきです(ディックはすでに言っています)

public class VoterFasade{
    public List<Voter> findVoter(long id,String password){
        List<Voter> results = em.createNamedQuery("Voter.findvoter")
            .setParameter("voterID", id)
            .setParameter("password",password)
            .getResultList();
        return result;
    }
}

それからあなたはそれを次のように使うことができます

@Inject
VoterFasade voterFasade;

///
long id=12;
voterFasade.findVoter(id);

実際に動作するはずです(そのコンパイルされていないコード)。

また、リポジトリでそれを行うこともできます。以下のリンクをチェックしてください。リポジトリのリスト23の例。リポジトリの例 ここにリンクの説明を入力してください

1
Reza P.