JPA を
必要としない
参考サイト
java - Lazy loading does not works for ManyToOne in eclipselink - Stack Overflow
JavaEE7を
はじめよう (9) - JPA TIPS - エンタープライズギークス (Enterprise Geeks) JPAの
微妙な ところで EclipseLinkと Hibernateを 比べてみる @OneToMany(2) - 水まんじゅう java - JPA Query selecting only specific columns without using Criteria Query? - Stack Overflow
JavaEE7を
はじめよう (4) - JPAクエリ(その1) JPQL - エンタープライズギークス (Enterprise Geeks)
発生した こと
Netbeans の
ManyToOne の
以下の
[EL Fine]: sql: 2016-10-30 12:53:14.109--ServerSession(315803384)--Connection(452259216)--SELECT id AS a1, create_date AS a2, description AS a3, name AS a4, site_url AS a5, update_date AS a6, held_year_id AS a7 FROM festival ORDER BY id ASC LIMIT ? OFFSET ? bind => [1000, 0] [EL Fine]: sql: 2016-10-30 12:53:14.146--ServerSession(315803384)--Connection(452259216)--SELECT id, create_date, held_year, update_date FROM held_year WHERE (id = ?) bind => [6] [EL Fine]: sql: 2016-10-30 12:53:14.156--ServerSession(315803384)--Connection(452259216)--SELECT id, create_date, held_year, update_date FROM held_year WHERE (id = ?) bind => [5] [EL Fine]: sql: 2016-10-30 12:53:14.158--ServerSession(315803384)--Connection(452259216)--SELECT id, create_date, held_year, update_date FROM held_year WHERE (id = ?) bind => [4] [EL Fine]: sql: 2016-10-30 12:53:14.159--ServerSession(315803384)--Connection(452259216)--SELECT id, create_date, held_year, update_date FROM held_year WHERE (id = ?) bind => [1]
実装上は、
SELECT id AS a1, create_date AS a2, description AS a3, name AS a4, site_url AS a5, update_date AS a6, held_year_id AS a7 FROM festival ORDER BY id ASC LIMIT ? OFFSET ?
ManyToOneの
SELECT id, create_date, held_year, update_date FROM held_year WHERE (id = ?)
テーブル構造は
Festival N件に
この際に、
と
Festivalから、
上記クエリを
private static final java.lang.String FIND_ALL_ORDER_BY_ID = new StrBuilder() .appendln("SELECT ") .appendln(" f ") .appendln("FROM ") .appendln(" Festival f ") .appendln("ORDER BY f.id ASC") .build(); /** * findAllByLimitAndOffset * @param limit * @param offest * @return */ public List<Festival> findAllByLimitAndOffset(int limit, int offest) { TypedQuery<Festival> q = em.createQuery(FIND_ALL_ORDER_BY_ID, Festival.class); q.setFirstResult(offest); q.setMaxResults(limit); return q.getResultList(); }
やってみた こと1(失敗事例)
NetBeansで Entityの 生成時に、 マッピングオプション 関連の フェッチを [デフォルト]から [遅延]に 変更する。
NetBeansの
関連の
@JoinColumn(name = "held_year_id", referencedColumnName = "id") @ManyToOne(optional = false) private HeldYear heldYearId;
関連の
@JoinColumn(name = "held_year_id", referencedColumnName = "id") @ManyToOne(optional = false, fetch = FetchType.LAZY) private HeldYear heldYearId;
この状態で
相変わらず、
やってみた こと2(失敗事例)
JPQL を 全Column取得から、 必要な データのみ 取得に 切り替える。
JPQLを
カラム指定で
- 修正後
private static final java.lang.String FIND_ALL_ORDER_BY_ID = new StrBuilder() .appendln("SELECT ") .appendln(" f.id, ") .appendln(" f.name, ") .appendln(" f.siteUrl, ") .appendln(" f.description, ") .appendln(" f.createDate, ") .appendln(" f.updateDate ") .appendln("FROM ") .appendln(" Festival f ") .appendln("ORDER BY f.id ASC") .build();
こちらを
java.lang.ClassCastException が
java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to xyz.monotalk.festivals4partypeople.models.rdb.entity.Festival
クエリで
と
やってみた こと3(失敗事例)
2 の JPQL を javax.persistence.Tuple に マッピング
以下のように
java.lang.ClassCastException が
まあ、
java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to javax.persistence.Tuple
/** * findAllByLimitAndOffset * @param limit * @param offest * @return */ public List<javax.persistence.Tuple> findAllByLimitAndOffset(int limit, int offest) { TypedQuery<javax.persistence.Tuple> q = em.createQuery(FIND_ALL_ORDER_BY_ID, javax.persistence.Tuple.class); q.setFirstResult(offest); q.setMaxResults(limit); return q.getResultList(); }
やってみた こと4(成功事例)
2 の JPQL を Object[] に マッピング
以下の
/** * findAllByLimitAndOffset * @param limit * @param offest * @return */ public List<Object[]> findAllByLimitAndOffset(int limit, int offest) { TypedQuery<Object[]> q = em.createQuery(FIND_ALL_ORDER_BY_ID, Object[].class); q.setFirstResult(offest); q.setMaxResults(limit); return q.getResultList(); }
やってみた こと5(成功事例)
new キーワード を 使って JPQL を Entityクラス に マッピング
JPQLと、
関連エンティティは
- JPQL
private static final java.lang.String FIND_ALL_ORDER_BY_ID = new StrBuilder() .appendln("SELECT NEW ") .appendln("xyz.monotalk.festivals4partypeople.models.rdb.entity.Festival (") .appendln(" f.id, ") .appendln(" f.name, ") .appendln(" f.siteUrl, ") .appendln(" f.description, ") .appendln(" f.createDate, ") .appendln(" f.updateDate ") .appendln(") ") .appendln("FROM ") .appendln(" Festival f ") .appendln("ORDER BY f.id ASC") .build();
- java
/** * findAllByLimitAndOffset * * @param limit * @param offest * @return */ public List<Festival> findAllByLimitAndOffset(int limit, int offest) { TypedQuery<Festival> q = em.createQuery(FIND_ALL_ORDER_BY_ID, Festival.class); q.setFirstResult(offest); q.setMaxResults(limit); return q.getResultList(); }
やってみた こと6(成功事例)
Querydsl を 使う
Querydsl と
それを
- 事前準備 pom.xml に
依存関係を 追加
最新Version が
jpa で
<dependency> <groupId>com.querydsl</groupId> <artifactId>querydsl-core</artifactId> <version>4.1.4</version> </dependency> <dependency> <groupId>com.querydsl</groupId> <artifactId>querydsl-jpa</artifactId> <version>4.1.4</version> </dependency> <dependency> <groupId>com.querydsl</groupId> <artifactId>querydsl-sql</artifactId> <version>4.1.4</version> </dependency>
- 事前準備 pom.xml に
アノテーションプロセッサの 定義を 追加
Entity の
アノテーションプロセッサ の
<plugin> <groupId>com.mysema.maven</groupId> <artifactId>apt-maven-plugin</artifactId> <version>1.1.3</version> <executions> <execution> <goals> <goal>process</goal> </goals> <configuration> <outputDirectory>target/generated-sources/java</outputDirectory> <processor>com.querydsl.apt.jpa.JPAAnnotationProcessor</processor> </configuration> </execution> </executions> <dependencies> <dependency> <groupId>com.querydsl</groupId> <artifactId>querydsl-apt</artifactId> <version>4.1.4</version> </dependency> </dependencies> </plugin>
以下、
Projections#constructor()で、
HeldYear を
- java
/** * findAllByLimitAndOffset * * @param limit * @param offest * @return */ public List<Festival> findAllByLimitAndOffset(int limit, int offest) { QFestival qFestival = QFestival.festival; JPAQueryFactory queryFactory = new JPAQueryFactory(em); List<Festival> results = queryFactory .select(Projections.constructor( Festival.class, qFestival.id, qFestival.name, qFestival.description, qFestival.siteUrl, qFestival.updateDate, qFestival.createDate)) .from(qFestival) .orderBy(qFestival.id.asc()) .limit(limit) .offset(offest).fetch(); return results; }
個人的には、
以上です。
コメント