Spring data jpa 为QueryDSL生成谓词时交叉连接

Spring data jpa 为QueryDSL生成谓词时交叉连接,spring-data-jpa,querydsl,cross-join,Spring Data Jpa,Querydsl,Cross Join,我正在使用带有Spring数据Jpa的查询DSL和queryDSL谓词执行器 我有以下实体 @Table(name="a_table") @Entity public class A { @OneToOne @JoinColumn(name = "b_id") private B b; } @Table(name="b_table") @Entity public class B { @Column(...) private String

我正在使用带有Spring数据Jpa的查询DSL和
queryDSL谓词执行器

我有以下实体

@Table(name="a_table")
@Entity
public class A {

     @OneToOne
     @JoinColumn(name = "b_id")
     private B b;
}

@Table(name="b_table")
@Entity
public class B {

     @Column(...)
     private String name;
}
当我构建
谓词
以传递到我的存储库时,我会这样做

QA qa = QA.a;
BooleanBuilder booleanBuilder = new BooleanBuilder();       
for(String name : strings) {
    BooleanExpression b_name_eq= qa.b.name.eq(name);
    BooleanExpression some_other_expression = ...;
    booleanBuilder.or(ExpressionUtils.and(b_name_eq, some_other_expression));
}
return booleanBuilder.getValue();
这将导致如下查询

select ... , ... , ...
from a_table at
cross join b_table bt  
where at.b_id=bt.id 
and (bt.name=? and some_other_expression or bt.name=? and some_other_expression or ...)

我的问题是,我可以控制何时生成谓词以使用连接而不是交叉连接?因为交叉连接被一些专家认为是缓慢的。我知道我可以通过
JPAQuery
轻松做到这一点,但我们没有使用它。任何帮助都将不胜感激。

我希望有人能回答这个问题。我只是在我的应用程序中遇到了它。这似乎是一个Hibernate+JPA“从这里不能到那里”的完全胡说八道的问题,让我希望我不必使用它。做得好,做一个愚蠢的加入计划。自己编写加入计划,丢失分页。请共享生成的JPQL查询和使用的Hibernate版本。看起来交叉连接是由Hibernate添加的。我还认为Hibernate只在关联映射为非可选时才这样做。然而,在Hibernate的旧版本中有一些怪癖,其中OneToOne关联几乎总是被视为非可选的。