使用联接和自定义参数构建条件查询

时间:2018-06-14 09:15:36

标签: java hibernate jpa

我需要使用JPA和条件查询构建以下查询,但我坚持加入条件。查询是:

SELECT p.*
FROM output cu
JOIN user ur ON cu.id = ur.id AND cu.key = ur.key 
JOIN product p ON cu.id = p.id AND cu.key = p.key
WHERE p.refreshtimestamp IS NOT NULL AND cu.active = true

到目前为止,我有以下内容,但如何应用加入条件:

CriteriaBuilder cb = entityManager.getCriteriaBuilder();
    CriteriaQuery<Output> cq = cb.createQuery(Output.class);
    Root<Output> output= cq.from(Output.class);
    Join<Output, User> user = output.join("user", JoinType.INNER);
    Join<User, Product> product = user.join("product", JoinType.INNER);

任何帮助将不胜感激

1 个答案:

答案 0 :(得分:0)

以下应该有帮助。

CriteriaBuilder builder = entityManager.getCriteriaBuilder();
CriteriaQuery<Product> criteria = builder.createQuery(Product.class);

Root<Output> outputRoot = criteria.from(Output.class);
Root<User> userRoot = criteria.from(User.class);
Root<Product> productRoot = criteria.from(Product.class);

Predicate[] predictes = {
    builder.equal(outputRoot.get("id"), userRoot.get("key")),
    builder.equal(productRoot.get("id"), userRoot.get("key")),
    builder.notEqual(productRoot.get("refreshtimestamp"), null), // not sure about null
    builder.equal(outputRoot.get("active"), true)
};

criteria.select(productRoot);
criteria.where(builder.and(predicates));

虽然这会产生cross joins查询,但它会有效,因为where子句使其像inner join一样工作。