JPA
[Java EE]
クエリ
名前付けクエリ
- 名前付きクエリは静的で変更できないという点で動的クエリとは異なります。
- 名前付きクエリの静的な性質から、動的クエリのような柔軟性は実現できませんが、永続性プロバイダはアプリケーションの起動時に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";
:
}
ページング
@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.