0

私はかなりうまく機能するSQLステートメントを持っています。しかし、play 2.1 で動作する Web アプリケーションに実装すると、次のエラーが発生します: javax.persistence.PersistenceException: クエリが SQLException:Column Index out of range, 0 < 1 をスローしました。

ここでこの質問を見つけました: RawSql を使用して ebean を介して MySQL クエリを実行中にエラーが発生しまし たが、他の例外が発生しました。

タグのリストを含むタグ付きスレッドを取得しようとしています (スタック オーバーフローと同じです)。ここにSQL文

SELECT t.topic 
FROM topic t 
WHERE 3 = (SELECT COUNT( DISTINCT ta.id ) 
           FROM topic_tag tt 
           INNER JOIN tag ta ON ta.id = tt.tag_id 
           WHERE ta.name IN ('children', 'spain','new') 
           AND tt.topic_id = t.id ) 

プレイ中、私はこれを行います:

RawSql rawSql = RawSqlBuilder.unparsed(sqlString).create();
result =  find.setRawSql(rawSql).findList();

その後、範囲外の例外が発生しました。その後、列マッピングを設定しようとします:

RawSql rawSql = RawSqlBuilder.unparsed(sqlString)
            .columnMapping("t.topic","topic")
            .columnMapping("t.id","id")
            .columnMapping("ta.name","tagList.name")
            .columnMapping("ta.id","tagList.id")
            .create();

今、私はヌルポインタ例外を取得します. おそらく、ebean がそこからクエリを作成できないためです。

ここに私のモデルからのいくつかのコード:

@Entity
public class Topic extends Model{

@Id
public Long id;

@Required
public String topic;

@ManyToMany
public List<Tag> tagList;
}


@Entity
public class Tag extends Model {

@Id
public long id;

@Required
public String name;
}

何度も試行錯誤した後、誰かがこれに対するヒントまたは解決策を見つけてくれることを願っています.

4

1 に答える 1

0

同様の問題で数時間を無駄にしました。実際にはid、特定の種類のモデルのフィールドのみをマッピングし、より少ない量のフィールドを選択することで解決できました。その後、他の値が自動的にロードされました-基本的に、値を選択しようとするとエラーが発生しましたお気に入り:

.. select e.id, e.name, e.description from exampleTable e ..次のようなマッピングを使用します。

RawSql rawSql = RawSqlBuilder.parse(sql)
// map the sql result columns to bean properties
.columnMapping("e.id", "exampleModel.id")
.columnMapping("e.name", "exampleModel.name")
.columnMapping("e.description", "exampleModel.description")
.create();

e.id選択のみとマップに変更した場合:

RawSql rawSql = RawSqlBuilder.parse(sql)
// map the sql result columns to bean properties
.columnMapping("e.id", "exampleModel.id")
.create();

それも読み込まれe.namee.descriptionモデル値とエラーが消えました。(もちろん、私自身のクエリにはいくつかの結合があり、これよりも少し複雑でしたが、基本は同じです。)

要約すると、この問題が発生した場合は、何もロードしていないことを確認し (columnMapping)、System.out.println(""); を使用します。または同様に、モデルに既に読み込まれている値を確認します。e.id同じモデルの下でより多くのデータをロードする可能性がある「@JoinColumn」などの注釈も確認することを忘れないでください - 指定された値に基づいて. e.idcolumnMapping 値として選択して設定しない場合は、必要なすべてのフィールドを次のように個別にリストする必要がある場合があります。.. e.name, e.description ..

うまくいけば、これらの調査結果は誰かを助けます。

于 2013-02-12T14:40:02.430 に答える