java - 标准 JPA 2 与 3 个表格

标签 java jpa-2.0 jpql criteria-api

我正在尝试创建一个标准以从 3 个表(关联、更新和详细信息)中检索一些对象。详细信息引用关联和更新,更新引用详细信息列表。我的目标是检索在指定字段中至少具有空值的详细信息的更新列表,给定关联 ID。在 JPQL 中很容易做到,但客户说这必须用标准编码。

我的 JPQL 是:

public List<Update> getUpdates(long associateId) {
    TypedQuery<Update> query = em.createQuery("select distinct u from Update u, Detail dt, Associate a "
        + "where dt.update = u and dt.associate = a and a.associateId = :id and "
        + "dt.ack_date is null", Update.class);
    query.setParameter("id", associateId);
    return query.getResultList();
}

我尝试了以下方法,但它只是返回了数据库中的所有更新:

public List<Update> getUpdates(long associateId) {
    CriteriaBuilder builder = em.getCriteriaBuilder();
    CriteriaQuery<Update> query = builder.createQuery(Update.class);

    Root<Update> fromUpdates = query.from(Update.class);
    Root<Associate> fromAssociate = query.from(Associate.class);
    Root<Detail> fromDetail = query.from(Detail.class);

    Join<Detail, Associate> associateJoin = fromDetail.join("associate");
    Join<Detail, Update> updateJoin = fromDetail.join("update");

    TypedQuery<Update> typedQuery = em.createQuery(query

            .select(fromUpdates)
            .where(builder.and(
                    builder.equal(fromAssociate.get("associateId"), associateId),
                    builder.equal(fromDetail.get("associate"), associateJoin),
                    builder.equal(fromDetail.get("update"), updateJoin),
                    builder.isNull(fromDetail.get("ack_date"))
            ))

            .orderBy(builder.asc(fromUpdates.get("updateId")))
            .distinct(true)
    );

    return typedQuery.getResultList();
}

谁能帮帮我?我搜索但找不到任何包含 3 个实体的示例。

最佳答案

每个连接都将您从左侧类型参数带到右侧。所以,details加入我的代码(第二行)从 fromUpdates 开始,即 Path<Update> , 并在幕后创造了一个 Path<Detail> .由此,您可以构建其他联接。试试这个(代码未测试):

Root<Update> fromUpdates = query.from(Update.class);
Join<Update, Detail> details = fromUpdates.join("details");
Join<Detail, Associate> associate = details.join("associate");
List<Predicate> conditions = new ArrayList();
conditions.add(builder.equal(associate.get("associateId"), associateId));
conditions.add(builder.isNull(details.get("ack_date")));

TypedQuery<Update> typedQuery = em.createQuery(query
        .select(fromUpdates)
        .where(conditions.toArray(new Predicate[] {}))
        .orderBy(builder.asc(fromUpdates.get("updateId")))
        .distinct(true)
);

关于java - 标准 JPA 2 与 3 个表格,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17154676/

相关文章:

java - JPQL 新对象实例化

java - 在 Wicket 中接收 jQuery 正文更改

java - spring boot远程shell自定义命令

java - CascadeType (DETACH/REMOVE/REFRESH) 在 OneToMany 上的真实使用情况?

Hibernate QueryException: 'Not all named parameters have been set' - native 查询包含::int

sql - 在 JPQL 中选择具有 group by 和 max 的行

java - 如何折叠JTree节点?

java - Spring MVC 表单 - 引用对象的模型

java - 线程中的异常 "main"java.lang.InknownClassChangeError : Implementing class

java - JPA 检查查询是否为空