简体   繁体   English

JPA条件从另一个查询中选择

[英]JPA Criteria select from another query

I am trying to select information from another query, like: 我正在尝试从另一个查询中选择信息,例如:

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

but i don't know how to create a Criteria Query to execute it. 但我不知道如何创建条件查询来执行它。 Can I execute it with Criteria API? 我可以使用Criteria API执行它吗?

try using this: https://docs.jboss.org/hibernate/orm/4.3/topical/html/metamodelgen/MetamodelGenerator.html 尝试使用此: https : //docs.jboss.org/hibernate/orm/4.3/topical/html/metamodelgen/MetamodelGenerator.html

need to create metaclasses your's entities. 需要创建您的实体的元类。

example, your's service class: 例如,您的服务等级:

@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;
    }
}

and your's controller or your's main: 和您的控制者或您的主要人员:

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_ - metamodel class. CustomersEntity_-元模型类。 No needs SQL-query. 无需SQL查询。

and your's infs is: 而您的infs为:

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM