【问题标题】:Reusable BooleanExpression in QueryDSLQueryDSL 中可重用的 BooleanExpression
【发布时间】:2013-05-15 04:58:22
【问题描述】:

我刚刚开始使用带有 Spring Data JPA 的 QueryDSL。我有一个存储所有谓词的类,因此在我的服务方法中,我可以通过传入布尔表达式在我的存储库上调用 findAll() 或 findOne()。这是一个例子:

谓词类方法:

public static BooleanExpression byCode(String code) {

  return QHeading.heading.code.eq(code);

}

服务类方法:

public Iterable<Heading> getByCode(final String code) {

  return headingRepository.findAll(byCode(code));

}

这很好用,但是在一个标题是另一个标题的子标题的情况下,我想重用我的谓词类中的相同方法,只需将它包装在另一个返回父标题的方法中,而不是与布尔表达式匹配的子项。但是,我在找出正确的方法来做这件事时遇到了一些麻烦。

所以,应该是这样的:

谓词方法:

public static BooleanExpression byCode(String code) {

  return QHeading.heading.code.eq(code);

}

public static BooleanExpression byChildCode(String code) {

  QHeading.heading.childHeadings.eq(byCode(code));

}

服务方式:

public Iterable<Heading> getByChildCode(final String code) {

  return headingRepository.findAll(byChildCode(code));

}

显然,eq() 方法不起作用,但有没有办法实现这一点,或者我应该完全以不同的方式解决这个问题?

【问题讨论】:

    标签: spring-data-jpa querydsl


    【解决方案1】:

    你可以这样做

    public static BooleanExpression byCode(String code) {
        return QHeading.heading.code.eq(code);
    }
    
    public static BooleanExpression byChildCode(String code) {
        return QHeading.heading.childHeadings.any().code.eq(code);
    }
    

    或者如果你想要更多的代码重用:

    private static BooleanExpression byCode(QHeading heading, String code) {
        return heading.code.eq(code);
    }
    
    public static BooleanExpression byCode(String code) {
        return byCode(QHeading.heading, code);
    }
    
    public static BooleanExpression byChildCode(String code) {
        return byCode(QHeading.heading.childHeadings.any(), code);
    }
    

    【讨论】:

    • 非常好。感谢您的回复。到目前为止似乎工作得很好。
    猜你喜欢
    • 2021-09-21
    • 2013-05-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-30
    • 1970-01-01
    • 2017-12-03
    相关资源
    最近更新 更多