在为QueryDSL构建谓词时交叉连接

时间:2014-07-07 03:45:25

标签: spring-data-jpa querydsl cross-join

我正在使用带有QueryDslPredicateExecutor

的Spring Data Jpa的Query DSL

我有以下实体;

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

当我构建Predicate以传递到我的存储库时,我会做这样的事情。

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轻松完成此操作,但我们并未使用它。任何帮助都将受到高度赞赏。

0 个答案:

没有答案