==[[JPA]]==
[[Java EE]] |
[[http://typea.info/blg/glob/jpa/ JPA]] |
===クエリ===
====名前付けクエリ====
*名前付きクエリは静的で変更できないという点で動的クエリとは異なります。
*名前付きクエリの静的な性質から、動的クエリのような柔軟性は実現できませんが、永続性プロバイダはアプリケーションの起動時にJPQL文字列をSQLに変換でき、クエリを実行するたびに毎回変換を行わないため、クエリの実行効率が高くなります。名前付きクエリの静的な性質から、動的クエリのような柔軟性は実現できませんが、永続性プロバイダはアプリケーションの起動時にJPQL文字列を[[SQL]]に変換でき、クエリを実行するたびに毎回変換を行わないため、クエリの実行効率が高くなります。
*単独なら@NamedQuery、複数の場合@NamedQueriesでまとめる 。
*または、対応するXMLディスクリプタ内のメタデータで定義する または、対応する[[XML]]ディスクリプタ内のメタデータで定義する 。
*同様に@NamedNativeQuery で、ネイティブクエリも名前付きクエリとして定義できる(@NamedNativeQueries で複数定義できる) 。
*一般的に、クエリ結果に直接対応するエンティティクラスに記述する。
@Entity
@NamedQueries({
@NamedQuery(name=Book.QUERY_FIND_BY_IDQUE[[R]]Y_FIND_BY_ID,
query="select b from Book b where b.id = :id"),
@NamedQuery(name=Book.QUERY_SELECT_ALLQUE[[R]]Y_SELECT_ALL,
query="select b from Book b"),
@NamedQuery(name=Book.QUERY_SELECT_BY_TITLEQUE[[R]]Y_SELECT_BY_TITLE,
query="select b from Book b where b.title like :title")})
@NamedNativeQuery(name=Book.QUERY_SELECT_MORE_EXPENSIVEQUE[[R]]Y_SELECT_MO[[R]]E_EXPENSIVE,
query="select * from book where price > :price", resultClass=Book.class)
public class Book {
public static final String QUERY_FIND_BY_ID QUE[[R]]Y_FIND_BY_ID = "Book.findBookById"; public static final String QUERY_SELECT_ALL = "Book.selectAllBooksselectAll[[Books]]"; public static final String QUERY_SELECT_BY_TITLE = "Book.selectBooksByTitleselect[[Books]]ByTitle"; public static final String QUERY_SELECT_MORE_EXPENSIVE = "Book.selectMoreExpensiveBooksselectMoreExpensive[[Books]]";
:
}
====ページング====
*setMaxResultssetMax[[R]]esults(limit) : 1ページ件数*setFirstResultsetFirst[[R]]esult(offset) : 先頭位置
@Stateless
public class BookService BookSer[[vi]]ce {
@Inject
private EntityManager em;
public List<Book> selectAllBooksselectAll[[Books]](int limit, int offset) { return em.createNamedQuery(Book.QUERY_SELECT_ALLQUE[[R]]Y_SELECT_ALL,Book.class) .setMaxResultssetMax[[R]]esults(limit) .setFirstResultsetFirst[[R]]esult(offset) .getResultListget[[R]]esultList()
;
}
}