如何使用Criteria API从Hibernate中的实体获取列表?

时间:2018-08-19 07:43:57

标签: java hibernate criteria-api

最近,我在使用Criteria API时遇到了问题。这是我第一次接触。这是我的OfficeEntity的一部分。

@Entity
@Table(name = "office")
public class OfficeEntity {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column (name = "office_id")
private Long id;

@OneToMany(cascade = CascadeType.ALL)
@JoinColumn(name="office_id", referencedColumnName = "office_id")
private List<WorkerEntity> workers = new ArrayList<>();

目标-从特定的办公室实体中获取工人实体列表。 到目前为止,我已经弄清楚了如何通过以下方式实现目标:

    @Override
public List<WorkerEntity> getWorkersByOffice(long officeId) {

    CriteriaBuilder cb = entityManager.getCriteriaBuilder();
    CriteriaQuery<OfficeEntity> query = cb.createQuery(OfficeEntity.class);

    Root<OfficeEntity> office = query.from(OfficeEntity.class);
    query.select(office).where(cb.equal(office.get("id"),officeId));

    TypedQuery<OfficeEntity> typedQuery = entityManager.createQuery(query);
    OfficeEntity foundOffice = typedQuery.getSingleResult();

    return foundOffice.getWorkers();

}

它运行良好,但是我认为我过于依赖Java List接口方法而不是Criteria API。我是否可以仅通过在Criteria中创建适当的查询来获取此WorkerEntity列表(OfficeEntity中的字段“ workers”)?如果是这样,可以提供任何建议或适当的解决方案吗?

最好的问候, 新手休眠和条件。

1 个答案:

答案 0 :(得分:0)

我假设Office和Worked实体之间存在两种绑定方式。如果没有,则使用@ManyToOne注释在Worked中创建父实体。然后下面的代码应该可以工作


@Override
    public List<WorkerEntity> getWorkersByOffice(long officeId) {

        CriteriaBuilder cb = entityManager.getCriteriaBuilder();
        CriteriaQuery<WorkerEntity> query = cb.createQuery(WorkerEntity.class);

        Root<WorkerEntity> worker= query.from(WorkerEntity.class);
        OfficeEntity office  = new OfficeEntity();
        office.setId(officeId);
        query.select(worker).where(cb.equal(worker.get("office"),office));

        TypedQuery<OfficeEntity> typedQuery = entityManager.createQuery(query);
        List<WorkerEntity> workerList= typedQuery.getResultList();

        return workerList;

    }