2013-05-20 3 views
1

스프링 데이터 JPA에서 QueryDSL을 사용하기 시작했습니다. 내 서비스 메서드에서 부울 식을 전달하여 내 리포지토리에서 findAll() 또는 findOne()을 호출 할 수 있도록 모든 조건부를 저장하는 클래스가 있습니다.QueryDSL에서 재사용 가능한 BooleanExpression

술어 클래스 방법 :

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() 방법은 작동하지 않지만,이 이 일을 성취 할 수있는 방법인가요, 아니면 전적으로이 일에 대해 다른 방향으로 나아가 야할까요?

답변

2

는 당신도이

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

처럼을하거나 수 있습니다 더 많은 코드 reusal을 원하는 경우 :

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

아주 좋은. 응답 해 주셔서 감사합니다. 지금까지 큰 일을하고있는 것 같습니다. – Luke