トップ 差分 一覧 ping ソース 検索 ヘルプ PDF RSS ログイン

JPA



目次



記事一覧

キーワード

JPA

[Java EE]

JPA

 クエリ

名前付けクエリ

  • 名前付きクエリは静的で変更できないという点で動的クエリとは異なります。
  • 名前付きクエリの静的な性質から、動的クエリのような柔軟性は実現できませんが、永続性プロバイダはアプリケーションの起動時にJPQL文字列をSQLに変換でき、クエリを実行するたびに毎回変換を行わないため、クエリの実行効率が高くなります。
  • 単独なら@NamedQuery、複数の場合@NamedQueriesでまとめる 。
  • または、対応するXMLディスクリプタ内のメタデータで定義する 。
  • 同様に@NamedNativeQuery で、ネイティブクエリも名前付きクエリとして定義できる(@NamedNativeQueries で複数定義できる) 。
  • 一般的に、クエリ結果に直接対応するエンティティクラスに記述する。
  • クエリ名は永続性ユニットごとにスコープがあり、スコープ内で一意でなければならない(クエリ名の前にエンティティ名をつけるのが一般的)。
  • クエリ名文字列でタイプミスによる問題を軽減するために、クエリ名を定数を置き換えることもできる
@Entity
@NamedQueries({
    @NamedQuery(name=Book.QUERY_FIND_BY_ID,
        query="select b from Book b where b.id = :id"),
    @NamedQuery(name=Book.QUERY_SELECT_ALL,
        query="select b from Book b"),
    @NamedQuery(name=Book.QUERY_SELECT_BY_TITLE,
        query="select b from Book b where b.title like :title")})
@NamedNativeQuery(name=Book.QUERY_SELECT_MORE_EXPENSIVE,
        query="select * from book where price > :price", resultClass=Book.class)
public class Book {
    public static final String QUERY_FIND_BY_ID = "Book.findBookById";
    public static final String QUERY_SELECT_ALL = "Book.selectAllBooks";
    public static final String QUERY_SELECT_BY_TITLE = "Book.selectBooksByTitle";
    public static final String QUERY_SELECT_MORE_EXPENSIVE = "Book.selectMoreExpensiveBooks";
     :
}

ページング

  • setMaxResults(limit) : 1ページ件数
  • setFirstResult(offset) : 先頭位置

 @Stateless

public class BookService {

    @Inject
    private EntityManager em;
   
	   public List<Book> selectAllBooks(int limit, int offset) {
        return em.createNamedQuery(Book.QUERY_SELECT_ALL,Book.class)
             .setMaxResults(limit)
             .setFirstResult(offset)
             .getResultList()
             ;
    }
}



YAGI Hiroto (piroto@a-net.email.ne.jp)
twitter http://twitter.com/pppiroto

Copyright© 矢木 浩人 All Rights Reserved.