简体   繁体   English

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

[英]How to get list from Entity in Hibernate using Criteria API?

Recently I've encountered problems using Criteria API. 最近,我在使用Criteria API时遇到了问题。 It is my very first contact with it. 这是我第一次接触。 Here is part of my OfficeEntity. 这是我的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<>();

GOAL - GET LIST OF WORKERS ENTITIES FROM SPECIFIC OFFICE ENTITY. 目标-从特定的办公室实体中获取工人实体的列表。 By now I've figured out how to achieve the goal by this: 到目前为止,我已经弄清楚了如何通过以下方式实现目标:

    @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();

}

And it works fine but I think I rely too much on Java List interface methods instead of Criteria API. 它工作正常,但我认为我过于依赖Java List接口方法而不是Criteria API。 Can I get this list of WorkerEntity (field "workers" in OfficeEntity) just by creating proper query in Criteria? 我是否可以仅通过在Criteria中创建适当的查询来获取此WorkerEntity列表(OfficeEntity中的字段“ workers”)? If then, can any advise or proper solution be delivered? 如果这样,可以提供任何建议或适当的解决方案吗?

Best regards, Newbie to Hibernate & Criteria. 最好的问候,新手休眠和标准。

I am assuming there is two way binding between Office and Worked entities. 我假设Office和Worked实体之间存在两种绑定方式。 If not create parent entity in Worked using @ManyToOne annotation. 如果没有,则使用@ManyToOne注释在Worked中创建父实体。 Then the below code should work 然后下面的代码应该工作


@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;

    }

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM