2016-11-12 2 views
0

から選択します。JPA基準は、私は同じように、他のクエリからの情報を選択しようとしている別のクエリ

SELECT user.user_id, product.first_time 
FROM USER AS user 
INNER JOIN (SELECT min(product.first_time) as first_time, 
        product.user_id 
      FROM PRODUCT AS product 
      GROUP BY (product.user_id) 
      ) product 
ON user.user_id = product.user_id 

が、私はそれを実行するための基準クエリを作成する方法がわかりません。 Criteria APIで実行できますか?

+0

JPQLとJPA基準がサブクエリに参加することはできません。 –

答えて

0

は、これを使用してみてください: https://docs.jboss.org/hibernate/orm/4.3/topical/html/metamodelgen/MetamodelGenerator.html

メタクラスあなたのエンティティを作成する必要があります。

たとえば、あなたのサービスクラス:

@Service("jpaCustomerService") 
@Repository 
@Transactional 

public class CustomerServiceImpl implements CustomerService { 
    @PersistenceContext 
    private EntityManager em; 

@Transactional(readOnly = true) 
    public List<CustomersEntity> findByCriteriaQuery(String name){ 
     CriteriaBuilder cb = em.getCriteriaBuilder(); 
     javax.persistence.criteria.CriteriaQuery<CustomersEntity> criteriaQuery = cb.createQuery(CustomersEntity.class); 
     Root<CustomersEntity> customersEntityRoot = criteriaQuery.from(CustomersEntity.class); 
     customersEntityRoot.fetch(CustomersEntity_.animal, JoinType.LEFT); 
     criteriaQuery.select(customersEntityRoot).distinct(true); 
     Predicate criteria = cb.conjunction(); 
     if (!name.isEmpty()){ 
      Predicate p = cb.equal(customersEntityRoot.get(CustomersEntity_.name), name); 
     criteria = cb.and(criteria, p); 
     } 
     criteriaQuery.where(criteria); 
     List<CustomersEntity> result = em.createQuery(criteriaQuery).getResultList(); 
     return result; 
    } 
} 

とあなたのコントローラやあなたのメイン:

public static void criteriaExample(GenericXmlApplicationContext ctx){ 
     CustomerService service = ctx.getBean("jpaCustomerService", CustomerService.class); 
     List<CustomersEntity> creteriaResult = service.findByCriteriaQuery("NCI-3"); 
     for (CustomersEntity customer : creteriaResult){ 
      System.out.println(customer); 
      if (!customer.getAnimal().isEmpty()) 
      for (AnimalsEntity animal : customer.getAnimal()){ 
       System.out.println(animal); 
      } 
     } 
    } 

CustomersEntity_ - メタモデルクラス。いいえ、SQLクエリは必要ありません。

とあなたのINFファイルは、次のとおりです。

public interface CustomerService { 
List<CustomersEntity> findByCriteriaQuery(String name);} 
+0

ありがとうございました! –

+0

ですが、質問には答えません。あなたは単に「基準のための静的メタモデルジェネレータがある」と言いました。そのSQLと同等の条件を作成する方法には答えません。サブクエリは無効なので、直接実行することはできません。 –

+0

"NCI-3" - エンティティの名前をdbにします。 – naut92

関連する問題