30. CRUD
• 問題:次のtestCrudメソッドで実行されるSQLとその順番は?
@RunWith(CdiTestRunner.class)
public class UserRepositoryTest {
@Inject
EntityManager em;
@Test
@Transactional
public void testCrud() {
UserEntity user = UserFactory.create();
em.persist(user);
UserEntity userInDb = em.find(UserEntity.class, user.getUserId());
userInDb.setFirstName("user");
em.merge(userInDb);
em.remove(userInDb);
}
}
31. JPQL SELECT
• UserRepositoryTest.javaにtestJpqlSelectメソッドを実装して実行
import javax.persistence.Query;
@RunWith(CdiTestRunner.class)
public class UserRepositoryTest {
@Test
public void testJpqlSelect() {
Query query = em.createQuery(
"SELECT u FROM UserEntity u WHERE u.userId LIKE :userId");
query.setParameter("userId", "user%");
List<UserEntity> users = query.getResultList();
System.out.println(users.size());
}
}
32. JPQL JOIN – NG example
• UserRepositoryTest.javaにtestJpqlSelectメソッドを実装して実行
• UserEntity.getGroupEntities()実行時にもSELECTされる!
@Dependent
@RunWith(CdiTestRunner.class)
public class UserRepositoryTest {
@Test
public void testJpqlJoin() {
Query query = em.createQuery(
"SELECT u FROM UserEntity u JOIN u.groupEntities g");
List<UserEntity> users = query.getResultList();
System.out.println(users.get(0).getGroupEntities());
}
}
34. JPQL JOIN – OK example
A) 関連プロパティ(groupEntities)が必要な場合
• JOINの後にFETCHをつける。FETCHの有り無しでSELECTするカラムが変わる。
B) 不要な場合
• デタッチする。
• 注意:デタッチした後に関連プロパティにアクセスすると例外が発生する。
@Dependent
@RunWith(CdiTestRunner.class)
public class UserRepositoryTest {
@Test
public void testJpqlJoin() {
Query query = em.createQuery(
"SELECT u FROM UserEntity u JOIN FETCH u.groupEntities g");
List<UserEntity> users = query.getResultList();
users.stream().forEach(u -> em.detach(u));
System.out.println(users.get(0).getGroupEntities());
}
}
A)
B)
35. JPQL UPDATE
• Entityを使わずにUPDATEする場合はJPQLでUPDATEする。
@Dependent
@RunWith(CdiTestRunner.class)
public class UserRepositoryTest {
@Test
@Transactional
public void testJpqlUpdate() {
Query query = em.createQuery(
"UPDATE UserEntity u SET u.lastName = :lastName "
+ "WHERE u.userId = :userId");
query.setParameter("lastName", "name");
query.setParameter("userId", "user0002");
System.out.println(query.executeUpdate());
}
}