使用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条件将实现您想要的。 代替: 使用 这将仅包括大于的组合,实际上大于的组合实际上将结果限制为每个组合的一个有效顺序。
我正在尝试使用Hibernate条件 API 从一个表连接到另一个表。问题是表合约只有定义为 long(所以没有 FK)的 salesId。然后我不确定如何将合同与销售联系起来。最好在下面的示例中解释。 该模式如下所示: 在合同实体中,我只有私有的Long salesId 我需要实现的是这样的: 所以我不能直接使用创建别名↓,因为它不知道Hibernate 我无法更改模型以在表之间创建 FK。有没