2013-04-12 8 views
0

EclipseLink/Examples/JPA/MappingSelectionCriteria에 따르면 OneToOne 또는 OneToMany 관계에 대한 필터링을 만들 수 있습니다. 그렇게하려면 DescriptorCustomizer을 구현해야합니다.Eclipselink JPA MappingSelectionCriteria 사용자 정의

내 질문 :이 기술로 일부 조건부 필터링을 수행 할 수 있습니까? 내가 언급 한 링크의 예에서 우리는 경우

Expression activeExp = eb.get("active").equal(true); 

"active" 항상 true하지 않은 표현이

public class ConfigureBsFilter implements DescriptorCustomizer { 

    public void customize(ClassDescriptor descriptor) throws Exception { 
     OneToManyMapping mapping = (OneToManyMapping) descriptor 
       .getMappingForAttributeName("bs"); 

     ExpressionBuilder eb = new ExpressionBuilder(mapping 
       .getReferenceClass()); 
     Expression fkExp = eb.getField("A_ID").equal(eb.getParameter("A_ID")); 
     Expression activeExp = eb.get("active").equal(true); 

     mapping.setSelectionCriteria(fkExp.and(activeExp)); 
    } 
} 

같은 그러나 무엇을 쓸 수있는, 의미하지만 일부에 의해 런타임에 설정해야합니다 매개 변수. 나는 그것을 어떻게 할 수 있습니까?

+0

여기에는 나쁜 아이디어가 있습니다. 완료되면 엔티티는 더 이상 데이터베이스에있는 것을 나타내지 않으며 컨텍스트에 병합중인 항목을 확인하지 못합니다. 엔티티가 읽은 엔티티를 필터링합니다. 일반적으로 매핑되지 않거나 게으르며 액세스 할 필요가 없으며 필요에 따라 필터를 사용하여 참조 된 객체를 쿼리하지 않는 것이 좋습니다. – Chris

답변

0

wiki.eclipse.org/Using_Advanced_Query_API_(ELUG)에서 쿼리 리디렉터가 동적으로 쿼리를 복제하고 필요에 따라 필터를 추가 할 수 있도록 ForeignReferenceMapping#getSelectionQuery()에서 쿼리 리디렉터를 사용할 수 있습니다. 리다이렉터에 매개 변수를 전달하는 것은 스레드 컨텍스트 나 세션의 속성 맵에 매개 변수를 저장하는 것과 같이 독창적 일 필요가 있습니다.

+0

조언을 주셔서 감사합니다,하지만 그것은 내게 약간 '해킹'하고 복잡하게 보입니다. 또한 나는 그것없이 떠날 수 있다는 것을 깨달았고 나의 의존성에 대한 별도의 전화를했다. 먼저 'Main'객체 컬렉션을 얻은 다음 종속 객체 컬렉션을 별도로 호출 한 다음 'Main'객체를 반복하고 루프의 두 번째 컬렉션에서 필요한 임시 속성을 채 웁니다. 또한이 방법은 캐시 일관성과 물건을 제동하지 않을 것이라고 생각하지만, 아마도 최적의 해결책은 아닙니다. – user1278890