QueryDSL 在构建谓词查询时添加交叉连接

Posted

技术标签:

【中文标题】QueryDSL 在构建谓词查询时添加交叉连接【英文标题】:QueryDSL add cross join when building predicate queries 【发布时间】:2015-10-28 01:32:09 【问题描述】:

我想根据modelB中的用户从modelA中获取数据。但是,对于每条记录,我都将在模型 B 中记录,这不是强制性的。所以当我使用下面的代码来获取数据时,它会返回 0 条记录。

BooleanExpression searchCriteria = searchCriteria
          .and(
                   qModelA.modelb.user.id.eq(userId)
              )
          .and ( some other conditions as well);

modelA.findAll(searchCriteria, pageable);

当我调试时,我发现 QueryDsl 放置了交叉连接。谁能告诉我如何解决这个问题,有什么方法可以让 querydsl 添加左连接而不是交叉连接?下面是我的两个模型。

@Entity
public class ModelA implements Serializable 

    private Long id;
    private String label;
    private ModelB modelB;

    @Id
    @SequenceGenerator(name = "modelASeq", sequenceName = "modela_id_seq", allocationSize = 1)
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "modelASeq")
    public Long getId() 
        return id;
    

    public void setId(Long id) 
        this.id = id;
    

    @Column(length = 150, nullable = false)
    public String getLabel() 
        return label;
    

    public void setLabel(String label) 
        this.label = label;
    

    @OneToOne(mappedBy = "modelA", cascade = CascadeType.REMOVE)
    public ModelB getModelB() 
        return modelB;
    

    public void setModelB(ModelB modelB) 
        this.modelB = modelB;
    



@Entity
public class ModelB implements Serializable 

    private Long id;
    private User user;
    private ModelA modelA;

    @Id
    @SequenceGenerator(name = "modelBSeq", sequenceName = "modelb_id_seq", allocationSize = 1)
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "modelBSeq")
    public Long getId() 
        return id;
    

    public void setId(Long id) 
        this.id = id;
    

    @NotNull
    @ManyToOne
    @JoinColumn(name = "user_id", nullable = false )
    public User getUser() 
        return user;
    

    public void setUser(User user) 
        this.user = user;
    

    @NotNull
    @OneToOne
    @JoinColumn(name = "modela_id", nullable = false)
    public ModelA getModelA() 
        return modelA;
    

    public void setModelA(ModelA modelA) 
        this.modelA = modelA;
    


【问题讨论】:

你是怎么解决的? 【参考方案1】:

如果您需要左连接,则需要使用显式连接:

query.from(modelA)
     .leftJoin(modelA.modelB, modelB)
     ...

【讨论】:

但问题是这不能与 findAll 方法一起使用。 谓词只是一个where过滤条件,你不能用它来表达任何东西。 @TimoWestkämper 问题是关于带有 querydsl 谓词的 spring data jpa,而不是关于原始 querydsl

以上是关于QueryDSL 在构建谓词查询时添加交叉连接的主要内容,如果未能解决你的问题,请参考以下文章

为 oneTomany 基于关系的查询编写 queryDSL 谓词查询

带有 Querydsl 的 JPA 谓词

如何使用 BooleanBuilder (QueryDSL) 为可选的 OnetoOne JPA/Hibernate 关系建模谓词?

有没有办法通过 QueryDSL 中的谓词 API 急切地获取惰性关系?

使用 QueryDSL 使用 Spring Data MongoDB 查询 DBRef

SpringDataJpa