当前位置: 首页 > 面试题库 >

使用JPA Criteria API,您可以执行仅导致一个联接的提取联接吗?

裴劲
2023-03-14
问题内容

使用JPA 2.0。似乎默认情况下(无显式提取),@OneToOne(fetch = FetchType.EAGER)在1 +
N个查询中提取字段,其中N是包含定义与不同相关实体的关系的Entity的结果数。使用Criteria API,我可能会尝试避免出现以下情况:

CriteriaBuilder builder = entityManager.getCriteriaBuilder();
CriteriaQuery<MyEntity> query = builder.createQuery(MyEntity.class);
Root<MyEntity> root = query.from(MyEntity.class);
Join<MyEntity, RelatedEntity> join = root.join("relatedEntity");
root.fetch("relatedEntity");
query.select(root).where(builder.equals(join.get("id"), 3));

理想情况下,以上内容应等效于以下内容:

SELECT m FROM MyEntity m JOIN FETCH myEntity.relatedEntity r WHERE r.id = 3

但是,条件查询会导致根表不必要地两次关联到相关实体表;一次用于获取,一次用于where谓词。产生的SQL看起来像这样:

SELECT myentity.id, myentity.attribute, relatedentity2.id, relatedentity2.attribute 
FROM my_entity myentity 
INNER JOIN related_entity relatedentity1 ON myentity.related_id = relatedentity1.id 
INNER JOIN related_entity relatedentity2 ON myentity.related_id = relatedentity2.id 
WHERE relatedentity1.id = 3

las,如果我只执行提取操作,那么我在where子句中没有表达式可以使用。

我是否缺少某些内容,或者这是Criteria API的限制吗?如果是后者,是否在JPA 2.1中对此进行了修正,或者是否有任何特定于供应商的增强功能?

否则,最好放弃编译时类型检查(我意识到我的示例不使用元模型),而使用动态JPQL TypedQueries。


问题答案:

而不是root.join(...)您可以使用root.fetch(...)哪个返回Fetch<>对象。

Fetch<> 是…的后代 Join<> 但可以类似的方式使用。

您只需要强制Fetch<>转换Join<>为适用于EclipseLink和Hibernate即可

...
Join<MyEntity, RelatedEntity> join = (Join<MyEntity, RelatedEntity>)root.fetch("relatedEntity");
...


 类似资料:
  • 问题内容: 我读了许多关于仅获得左联接的第一行的主题,但是由于某种原因,这对我不起作用。 这是我的结构(当然是简化的) 提要 艺人 feeds_artists 现在,我想获取文章并仅加入第一位艺术家,我想到了这样的事情: 只是仅获取feeds_artists的第一行,但已经行不通了。 由于数据库原因,我无法使用,也无法按结果对结果进行分组(因为我需要按日期对它们进行排序(我通过这种方式对结果进行分

  • 我读过很多关于只获得左联接的第一行的文章,但是,由于某些原因,这对我不起作用。 这里是我的结构(当然是简化的) 源 只获得feeds_artists的第一行,但这已经不起作用了。 由于数据库的原因,我不能使用并且我不能按对结果进行分组,因为我需要按日期对它们进行排序(我通过这样分组得到了结果,但结果不是最新的) 也尝试了一些外用的东西--也没有成功。老实说,我真的想象不出这些排是怎么回事--这可能

  • 使用JPA 2.0。默认情况下(无显式提取),字段在1 N个查询中提取,其中N是包含定义与不同相关实体关系的实体的结果数。使用Criteria API,我可能会尝试如下避免: 理想情况下,上述内容应等同于以下内容: 但是,条件查询会导致根表不必要地与相关实体表联接两次;一次用于fetch,一次用于where谓词。生成的SQL如下所示: 唉,如果我只做fetch,那么我就没有在where子句中使用的

  • 问题内容: 我不是数据库专家,所以我需要一些有关正在处理的查询的帮助。在我的照片社区项目中,我不仅要显示标签名称和计数器(标签中的图像数量),而且还想显示标签中最受欢迎的图像(最因果),以丰富标签的可视化效果。 表设置如下: 图像表包含基本图像元数据,重要的是因果字段 Imagefile表每个图像包含多个条目,每种格式一个 标签表保存标签定义 Tag_map表将标签映射到图像 在我通常的试验和错误

  • 问题内容: 我目前有一张包含以下记录的表: 其中同一字母表示一些共同的标准(例如,“字母”列的共同值)。我按照以下标准进行自我加入: 此联接提供如下内容: 但是,我只希望每对都包含一次(组合而不是排列)。我将如何获得以下信息: 问题答案: 稍微更改JOIN条件将实现您想要的。 代替: 使用 这将仅包括大于的组合,实际上大于的组合实际上将结果限制为每个组合的一个有效顺序。

  • 以下是在我的Solr4.7.2中配置的示例文档和字段 以下是索引的数据 (field1:value1或field2:value2或field3:value3或{!join from=some_id TO=some_other_id}field4:value4或{!join from=some_field_is TO=some_other_field_id}field5:value5)和field7