2

編集:問題に関係のない詳細を削除してクリーンアップします。

問題。JPA クエリは結果を返しません。

String qstr = "select o from MyStats o where o.queue_name = :queue"; 
String queue = "3";
em.createQuery(qstr).setParameter("queue", queue);

問題は、JPA クエリの構文が正しくないか、EmbeddedID の注釈が正しくないことにあると思いました。したがって、関連するクラスの定義を投稿しましたが、それが Oracle であることを除けば、データベース テーブルについては何も言いませんでした。

私のテストコード:DBから読み取り、最初の値を取得し、その値を後続の選択クエリで再利用して、レコードが存在することを意味します。そこにあるはずです、読んだだけですよね?

テスト

String queue = ""; 
String qstr1 = "select o from MyStats o";
String qstr2 = "select o from MyStats o where o.queue_name = :queue"; 

logger.debug("SQL query: " + qstr1); 
List<MyStats> list = em.createQuery(qstr1).getResultList();
logger.debug("111 Returning results: " + list.size());
for (MyStats s : list) {
    queue = s.getQueue_name();
    logger.debug("Picking queue name: " + queue); 
    break;
}

logger.debug("SQL query: " + qstr2); 
list = em.createQuery(qstr2).setParameter("queue", queue).getResultList();
logger.debug("222 Returning results: " + list.size());

出力:

SQL query: select o from MyStats o
111 Returning results: 166
Picking queue name: 3
SQL query: select o from MyStats o where o.rec_id.queue_name = :queue 
222 Returning results: 0

クラス定義

@Entity
public class MyStats {
    private String queue_name;
    private long stats_id;

    ... //getters and setters
}

WHERE 句のないクエリは、MyStats クラスのメンバーを含むクエリとして正しく機能します。

em.createQuery("select o from MyStats o where o.stats_id = :sid").setParameter("sid", 179046583493L);

Oracle 10データベース、Java EE 5 SDK、Glassfish 2.1を使用しています。

4

1 に答える 1

0

問題は、Java String 型からデータベース列の CHAR 型へのマッピングにあるようです。

データベース テーブル queue_name 列はCHAR(20)として定義され、Java 型はStringです。

それを修正するためのいくつかのオプションがあります

  1. データベース列の CHAR 型を VARCHAR に置き換える
  2. リクエストごとにクエリ パラメータ値にスペースを埋め込む
  3. equals = の代わりに LIKE 条件を使用し、パラメーター値の末尾に % を追加します
  4. 投機的: キャストを使用

(1) データベーステーブルを制御できる場合は許容されます

(2) 指定された select ステートメントで機能しますが、JOIN で壊れる可能性があります

(3) トリックに失敗する可能性があります。LIKE 'a%' は、'a' だけでなく、'aa'、'abc' なども返します。

(4) これは私には完全には明らかではありません。採用できるかどうかはわかりません:

em.createNativeQuery("select cast(queue_name as CHAR(20)) from ..."); 
于 2013-09-17T03:46:56.493 に答える