QueryDSL中可重用的BooleanExpression

时间:2013-05-20 15:25:12

标签: spring-data-jpa querydsl

我刚开始使用带有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()方法不起作用,但是有没有办法实现这一点,或者我应该采取不同的方式来完成这个问题?

1 个答案:

答案 0 :(得分:3)

你可以这样做

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