Java 使用联接和自定义参数生成条件查询

Java 使用联接和自定义参数生成条件查询,java,hibernate,jpa,Java,Hibernate,Jpa,我需要使用JPA和criteria查询构建以下查询,但我坚持使用连接条件。查询是: 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 到目前为止,我有以下内容,但如何应用联接条件

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

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);
CriteriaBuilder cb=entityManager.getCriteriaBuilder();
CriteriaQuery cq=cb.createQuery(Output.class);
根输出=cq.from(output.class);
Join user=output.Join(“user”,JoinType.INNER);
Join product=user.Join(“产品”,JoinType.INNER);
任何帮助都将不胜感激

以下内容将有所帮助

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));
CriteriaBuilder=entityManager.getCriteriaBuilder();
CriteriaQuery criteria=builder.createQuery(Product.class);
Root outputRoot=criteria.from(Output.class);
Root userRoot=criteria.from(User.class);
Root productRoot=criteria.from(Product.class);
谓词[]预测={
builder.equal(outputRoot.get(“id”)、userRoot.get(“key”),
builder.equal(productRoot.get(“id”)、userRoot.get(“key”),
builder.notEqual(productRoot.get(“refreshttimestamp”),null),//不确定是否为null
builder.equal(outputRoot.get(“活动”),true)
};
条件。选择(productRoot);
其中(builder.和(谓词));
尽管这会产生
交叉联接
查询,但它会工作,因为
where
子句使它像
内部联接
一样工作