Java JPA CriteriaQuery中不需要的交叉连接在子查询中选择
在执行select IN子查询时,我得到了我认为不必要的交叉连接,这会影响性能。如果有区别的话,我会用Postgres 我的目标是生成以下查询 从作者a1中选择a1.first_name 其中a1.last_name=? 和a1.id 选择不同的b.author\u id b书 b.U在哪?和 按b.author\u id分组 具有countb.author\u id>=2的 但我明白了 从作者a1中选择a1.first_name 其中a1.last_name=? 和a1.id 选择不同的b.author\u id b书 交叉连接author a2,其中b.author\u id=a2.id-此表达式:bookRoot.getBook\u.author表示隐式地将author连接到Book 要消除额外的联接,您必须使用本机查询,或者将map Book.author\u id再次用作简单列:Java JPA CriteriaQuery中不需要的交叉连接在子查询中选择,java,sql,jpa,criteria,criteria-api,Java,Sql,Jpa,Criteria,Criteria Api,在执行select IN子查询时,我得到了我认为不必要的交叉连接,这会影响性能。如果有区别的话,我会用Postgres 我的目标是生成以下查询 从作者a1中选择a1.first_name 其中a1.last_name=? 和a1.id 选择不同的b.author\u id b书 b.U在哪?和 按b.author\u id分组 具有countb.author\u id>=2的 但我明白了 从作者a1中选择a1.first_name 其中a1.last_name=? 和a1.id 选择不同的b.a
@Column(name = "author_id", insertable = false, updatable = false)
private Long authorId;
而使用Book_uu.authord。Criteria API只生成一个JPQL查询,我在该部分中没有看到任何条件逻辑,这意味着您可以跳过它,直接使用JPQL查询。如果您必须生成各种where、having或orderby条件,那么使用它是有意义的。现在,您不需要它,但是TypedQuery会给您带来问题。返回的类型是字符串,而不是字符串Author@coladictTypedQuery可以工作/编译,并成功返回字符串!我认为这是由于运行时代码中的类型擦除更新了CriteriaQuery和TypedQueryTanks@crizzis——我将Long authorId设置为只读属性,以确保它不能更改。由于author_id是author-author的联接列的默认名称,因此该操作非常有效。我可能会更新这个例子,在Author上增加一个JoinColumn,让它更清楚一点。
@Column(name = "author_id", insertable = false, updatable = false)
private Long authorId;