| ページ一覧 | ブログ | twitter |  書式 | 書式(表) |

MyMemoWiki

「JPA」の版間の差分

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

2020年2月16日 (日) 04:28時点における最新版

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()
             ;
    }
}