这是我的HQL
select distinct p from PayerCriteria p where p.determinationRequest.id = :determinationRequestId
我认为这里唯一重要的未知数是 determinationRequest.id
是一个 Long
.
你不需要一定要创建 Join 对象。类似这样的东西应该对你有用。
CriteriaQuery<PayerCriteria> criteriaQuery = criteriaBuilder.createQuery(PayerCriteria.class);
Root<PayerCriteria> root = criteriaQuery.from(PayerCriteria.class);
//where on FK clause can be created like so
Predicate wherePredicate = criteriaBuilder.equal(root.get("determinationRequest").get("id"), determinationRequestId);
//Method call criteriaQuery.distinct(true) ensures the distinctness of items in ResultList.
criteriaQuery.select(root).where(wherePredicate).distinct(true);
Query<PayerCriteria> query = session.createQuery(criteriaQuery);
List<PayerCriteria> payerCriteriaList = query.getResultList();
如果你想使用CriteriaAPI,你需要这样做。
final CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder();
final CriteriaQuery<PayerCriteria> criteriaQuery = criteriaBuilder.createQuery(PayerCriteria.class);
final Root<PayerCriteria> root = criteriaQuery.from(PayerCriteria.class);
criteriaQuery.select(root);
final Join join = root.join("determinationRequest");
final Predicate predicate = criteriaBuilder.equal(join.get("id"), 1);
criteriaQuery.where(predicate);
final TypedQuery<PayerCriteria> query = entityManager.createQuery(criteriaQuery);
System.out.println("------------>" + query.getResultList());
有一个名为EasyCriteria的框架可以让这个负担变得更简单 (http:/easycriteria.uaihebert.com). 上述标准会像。
EasyCriteria<RegularEntityOne> easyCriteria = EasyCriteriaFactory.createQueryCriteria(entityManager, RegularEntityOne.class);
easyCriteria.innerJoin("regularEntityTwo");
easyCriteria.andEquals("regularEntityTwo.id", 1);
System.out.println("------------>" + easyCriteria.getResultList());