Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/80.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JPA CriteriaQuery中不需要的交叉连接在子查询中选择_Java_Sql_Jpa_Criteria_Criteria Api - Fatal编程技术网

Java JPA CriteriaQuery中不需要的交叉连接在子查询中选择

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

在执行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再次用作简单列:

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