当前位置: 首页 > 知识库问答 >
问题:

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

师冥夜
2023-03-14

最近,我在使用标准应用编程接口时遇到了问题。这是我第一次接触它。这是我的办公室实体的一部分。

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

}

它工作得很好,但我认为我太依赖JavaList接口方法而不是CriteriaAPI。我可以通过在Criteria中创建适当的查询来获取WorkerEntity(OfficeEntity中的字段“workers”)列表吗?如果这样,是否可以提供任何建议或适当的解决方案?

最好的问候,新手到冬眠

共有1个答案

蓬威
2023-03-14

我假设办公室和工作实体之间存在双向绑定。如果没有,则使用@ManyToOne注释在“已工作”中创建父实体。那么下面的代码应该可以工作

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

    }
 类似资料:
  • 我正在尝试使用Hibernate方法。 表有三列: col1 col2 col3 工作 不工作 错误: 在此ResultSet中找不到列col3。 我只需要从表中检索几个特定的列,而不是整个表。 我该如何实现这一点?

  • 我试图表示项目之间的父/子关系,这些项目只在一个特殊的item_type列中通过一个值(值为:无,父母,孩子)有所不同,父母和孩子有相同的元article_id。我想为所有项目重用相同的表和实体,因为父/子/无项目之间的字段没有区别。我想要hibernate做的sql并返回为List是这样的: 这是我的实体: 这是一个枚举,显示该项是父项、子项还是没有子项的简单项: 和数据库表: 问题是我似乎找不

  • 问题内容: 要获取包含整数的列的最大值,我可以使用以下T-SQL命令 是否有可能使用实体框架获得相同的结果。 假设我有以下模型 如何获得最大的年龄? 问题答案: 试试这个 并确保您位于文件的顶部

  • 问题内容: 但是,首选解决方案(属性访问)在我的情况下不起作用(我缺少列异常-为什么?) 该模型如下所示:实体和。表含有列是的表,以便它是典型的关系。 现在的问题是,如果我取的实体,我需要有机会获得价值(亦称的实体),而不取实体。我怎样才能做到这一点? 我使用的映射如下所示: 我想做的是调用而无需从DB中额外获取实体。 根据我上面提到的答案,如果我将注释从字段移到getter(在实体上,我对吗?)

  • 我使用hibernate进行数据库通信。我有一个类: 现在我想用它的主键来获取这个对象,但是这个对象应该只有特定的列? 我尝试使用标准和投影,它返回一个结果,但它没有映射到我期望的对象(Person Object) 任何想法如何解决这个问题使用Hibernate查询/标准? 谢谢

  • 我有两个实体与单向@OneTo多项映射: 我想获得所有B实体的列表,它们是匹配限制的A实体的子实体。 这就是我卡住的地方:c.list()将返回给我一个对象列表。我不关心A,我想要B。我如何使用Hibernate标准/预测来完成它?如果有关系,我使用Hibernate 4.2.12 在这种简化的情况下,只是急切地去拿是有意义的;在真实的例子中,有一个由四个一对一的单向关联组成的链,我想让所有(或者