33

javaとjpaで関数searchBookを実行しようとしています。MediaとBookの2つのクラスがあります。本はメディアを拡張します。そして、データを別のテーブルに保持します。以下のクエリからデータを選択しようとしています。

TypedQuery<Media> query = em.createQuery(
                "SELECT m.title, b.isbn, b.authors"
                        + " FROM Book b, Media m" + " WHERE b.isbn = :isbn"
                        + " OR lower(m.title) LIKE :title"
                        + " OR b.authors LIKE :authors", Media.class);
        query.setParameter("isbn", book.getisbn());
        query.setParameter("title", "%" + book.getTitle().toLowerCase()
                + "%");
        query.setParameter("authors", "%" + book.getAuthors() + "%");
        bookList = query.getResultList();

しかし、エラーが発生しました:

java.lang.IllegalArgumentException: 複数の戻り値を持つクエリの TypedQuery を作成できません

JPAを使用するのはこれが初めてです。間違いが見つかりません。

4

6 に答える 6

64

回避策として、他のエンティティ属性で構成されたエンティティを取得するには、クエリ内で作成し、コンストラクタを提供します。

クエリ:

TypedQuery<Media> query = em.createQuery("SELECT NEW package_name.Media(m.title, b.isbn, b.authors)"
+ " FROM Book b, Media m" 
+ " WHERE b.isbn = :isbn"                         
+ " OR lower(m.title) LIKE :title"                         
+ " OR b.authors LIKE :authors", Media.class); 

実在物 :

public Media(String title, int isbn, String author){

    //-- Setting appropriate values
}

サンプルを提供しました。それに応じてコンストラクターのデータ型を変更します。

于 2012-05-30T08:14:47.583 に答える
0

Hibernate バージョン < 4 を使用している場合、このバグに遭遇する可能性があります。

v3.5でも同じ問題が発生します。最後に、単純なクエリを使用して、各パラメーターを手動でキャストする必要がありました

ここで他のコメントを参照してください: https://groups.google.com/forum/#!topic/axonframework/eUd1d4rotMY

于 2014-01-28T16:29:25.107 に答える