複数件データを取得するSELECT

JPQL・CriteriaBuilderを利用したデータ検索

結果が複数件のデータとなるSELECTを実施する場合は、JPQLを使用して実装する。実行結果のソートや条件指定がある場合は、適宜CriteriaBuilderで組み立ててもよい。

例)ユーザの全件検索、条件指定検索、CriteriaBuilderを使用した検索

test-javaee6-ejb org.debugroom.test.domain.repository.impl.jpa.UserRepository

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
package org.debugroom.test.domain.repository.impl.jpa;

import java.util.List;

import javax.ejb.Stateless;
import javax.ejb.TransactionAttribute;
import javax.ejb.TransactionAttributeType;
import javax.persistence.Query;
import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery;

import org.debugroom.test.domain.model.User;
import org.debugroom.test.domain.repository.UserRepository;

@Stateless
@TransactionAttribute(TransactionAttributeType.REQUIRED)
public class UserRepositoryImpl extends GenericDaoImpl<User, String> implements UserRepository{

    @SuppressWarnings("unchecked")
    @Override
    public List<User> findAll() {
        //JPQLを使用して、データアクセスする。結果のソート等必要に応じて
        Query query =  entityManager.createQuery("From User u");
        return (List<User>)query.getResultList();
    }

    @Override
    public boolean exists(String userId) {
        //条件指定を行う場合のJPQL
        Query query =  entityManager.createQuery("select count(u) from User u where u.userId = :userId");
        query.setParameter("userId", userId);
        if(query.getResultList().size() == 0){
            return false;
        }
     return true;
        }

     @Override
     public Long count() {
         // CriteriaBuilderを使用する場合
         CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder();
         CriteriaQuery<Long> criteriaQuery = criteriaBuilder.createQuery(Long.class);
         criteriaQuery.select(criteriaBuilder.count(criteriaQuery.from(User.class)));
         Query query =  entityManager.createQuery(criteriaQuery);
         return (Long)query.getSingleResult();
     }