「JPA」の版間の差分
ナビゲーションに移動
検索に移動
| 1行目: | 1行目: | ||
| − | ==JPA== | + | ==[[JPA]]== |
[[Java EE]] | | [[Java EE]] | | ||
| − | + | [http://typea.info/blg/glob/jpa/ JPA] | |
===クエリ=== | ===クエリ=== | ||
====名前付けクエリ==== | ====名前付けクエリ==== | ||
*名前付きクエリは静的で変更できないという点で動的クエリとは異なります。 | *名前付きクエリは静的で変更できないという点で動的クエリとは異なります。 | ||
| − | * | + | *名前付きクエリの静的な性質から、動的クエリのような柔軟性は実現できませんが、永続性プロバイダはアプリケーションの起動時にJPQL文字列を[[SQL]]に変換でき、クエリを実行するたびに毎回変換を行わないため、クエリの実行効率が高くなります。 |
*単独なら@NamedQuery、複数の場合@NamedQueriesでまとめる 。 | *単独なら@NamedQuery、複数の場合@NamedQueriesでまとめる 。 | ||
| − | * | + | *または、対応する[[XML]]ディスクリプタ内のメタデータで定義する 。 |
*同様に@NamedNativeQuery で、ネイティブクエリも名前付きクエリとして定義できる(@NamedNativeQueries で複数定義できる) 。 | *同様に@NamedNativeQuery で、ネイティブクエリも名前付きクエリとして定義できる(@NamedNativeQueries で複数定義できる) 。 | ||
*一般的に、クエリ結果に直接対応するエンティティクラスに記述する。 | *一般的に、クエリ結果に直接対応するエンティティクラスに記述する。 | ||
| 16行目: | 16行目: | ||
@Entity | @Entity | ||
@NamedQueries({ | @NamedQueries({ | ||
| − | @NamedQuery(name=Book. | + | @NamedQuery(name=Book.QUE[[R]]Y_FIND_BY_ID, |
query="select b from Book b where b.id = :id"), | query="select b from Book b where b.id = :id"), | ||
| − | @NamedQuery(name=Book. | + | @NamedQuery(name=Book.QUE[[R]]Y_SELECT_ALL, |
query="select b from Book b"), | query="select b from Book b"), | ||
| − | @NamedQuery(name=Book. | + | @NamedQuery(name=Book.QUE[[R]]Y_SELECT_BY_TITLE, |
query="select b from Book b where b.title like :title")}) | query="select b from Book b where b.title like :title")}) | ||
| − | @NamedNativeQuery(name=Book. | + | @NamedNativeQuery(name=Book.QUE[[R]]Y_SELECT_MO[[R]]E_EXPENSIVE, |
query="select * from book where price > :price", resultClass=Book.class) | query="select * from book where price > :price", resultClass=Book.class) | ||
public class Book { | public class Book { | ||
| − | public static final String | + | public static final String QUE[[R]]Y_FIND_BY_ID = "Book.findBookById"; |
| − | public static final String QUERY_SELECT_ALL = "Book. | + | public static final String QUERY_SELECT_ALL = "Book.selectAll[[Books]]"; |
| − | public static final String QUERY_SELECT_BY_TITLE = "Book. | + | public static final String QUERY_SELECT_BY_TITLE = "Book.select[[Books]]ByTitle"; |
| − | public static final String QUERY_SELECT_MORE_EXPENSIVE = "Book. | + | public static final String QUERY_SELECT_MORE_EXPENSIVE = "Book.selectMoreExpensive[[Books]]"; |
: | : | ||
} | } | ||
====ページング==== | ====ページング==== | ||
| − | * | + | *setMax[[R]]esults(limit) : 1ページ件数 |
| − | * | + | *setFirst[[R]]esult(offset) : 先頭位置 |
@Stateless | @Stateless | ||
| − | public class | + | public class BookSer[[vi]]ce { |
@Inject | @Inject | ||
private EntityManager em; | private EntityManager em; | ||
| − | public List<Book> | + | public List<Book> selectAll[[Books]](int limit, int offset) { |
| − | return em.createNamedQuery(Book. | + | return em.createNamedQuery(Book.QUE[[R]]Y_SELECT_ALL,Book.class) |
| − | . | + | .setMax[[R]]esults(limit) |
| − | . | + | .setFirst[[R]]esult(offset) |
| − | . | + | .get[[R]]esultList() |
; | ; | ||
} | } | ||
} | } | ||
2020年2月16日 (日) 04:28時点における最新版
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() ; } }
© 2006 矢木浩人