【问题标题】:Criteria API join untyped: Query values from related Entities (One-To-Many)Criteria API join untyped:从相关实体查询值(一对多)
【发布时间】:2013-11-15 07:35:19
【问题描述】:

我目前正在努力使用 JPA Criteria API 创建查询。我想动态构建我的查询。使用元模型和类型化查询对我来说是没有选择的。 假设我有以下实体:

@Entity
@Table(name = "MYENTITY")
public class MyEntity {
...
    @OneToMany(mappedBy = "myEntity", fetch = FetchType.LAZY)
    private Set<MyRelatedEntity> myRelatedEntities;
...
}

@Entity
@Table(name = "MYRELATEDENTITY")
public class MyRelatedEntity {
...
    @ManyToOne
    @JoinColumn(name = "MYENTITY", nullable = false)
    private MyEntity myEntity;
...
}

我尝试通过加入“MyEntity”来查询“MyRelatedEntity”中的字段:

    CriteriaBuilder builder = em.getCriteriaBuilder();
    CriteriaQuery<Object[]> query = builder.createQuery(Object[].class);
    Root<MyEntity> root = query.from(MyEntity.class);
    root.join("myRelatedEntities");
    query.select(builder.array(root.get("myRelatedEntities").get("name")));
    Query queryCriteria = em.createQuery(query);
    List<Object[]> resultRows = queryCriteria.getResultList();

resultRows 是一个空列表,尽管直接在数据库上的以下查询给了我结果:

Select myrelent.name from MYENTITY myent, MYRELATEDENTITY myrelent where myent.id = myrelent.myentity;

使用条件 API 构建的查询有什么问题?任何帮助表示赞赏!

【问题讨论】:

  • 问题是……?
  • 如果你还是要无类型,为什么不使用 JPQL 并为自己节省一个 PITA?
  • @kostja:如果字符串“name”是动态生成的,那是完全合理的。

标签: hibernate jpa one-to-many criteria criteria-api


【解决方案1】:

您不需要指示 CriteriaBuilder 返回一个数组:它无论如何都会做正确的工作。因此,只需将返回类型更改为 String 和 select 语句:

CriteriaQuery query = builder.createQuery(String.class);
Root<MyEntity> root = query.from(MyEntity.class);
query.select(root.get("myRelatedEntities").get("name"));
Query queryCriteria = em.createQuery(query);
List<String> resultRows = queryCriteria.getResultList();

不相关:关于连接,标准的连接方式是:

Join<MyEntity, MyRelatedEntity> related = root.join("myRelatedEntities");
query.select(related.get("name"));

但是很高兴知道您的方法完全有效!

【讨论】:

  • 使用连接对象(在本例中为“相关”)来查询其属性解决了我的问题。干杯。
猜你喜欢
  • 2013-07-16
  • 1970-01-01
  • 2015-08-14
  • 2010-10-17
  • 2012-12-18
  • 2022-12-21
  • 2010-12-18
  • 2023-04-07
  • 2010-09-20
相关资源
最近更新 更多