2010-11-23 3 views
1

내 DB 모델은 다음과 같습니다 :필터 CayenneDataObject getXXXArray() 항목에 매개 변수가 있습니까?

그래서 객체 A a에 대한 카이엔에서 나는 이것이 항목을 주어진에서 나에게 B의 모든 항목을 반환 a.getBArray()을 할 수
A.id (1 : n) B.ad_id 

. 그러나 active = 1 속성을 기반으로이 목록을 필터링하고 싶습니다.

분명히 Expression.fromString("active = 1")SelectQuery과 사용할 수 있지만이 접근법에서는이 쿼리를 실행하려는 A 인스턴스를 어떻게 연관시키는 지 찾을 수 없습니다.

다른 접근 방식은 a.getBArray()에서 모든 항목을 검색하고 active == true이있는 코드 만 검색하면이 방법은 비효율적입니다.

권장 사항은 대개 감사하겠습니다.

고맙습니다. Maxim.

- 편집 :

내 현재 솔루션은 수 (개체 이름이 각각 & B로 대체되었습니다) :

long aId = DataObjectUtils.longPKForObject(db_a_instance); 
String bSQL = "select * from b where active = 1 and a_id = " + aId; 
SQLTemplate bQuery = new SQLTemplate(B.class, bSQL); 
List<B> dbBs = context.performQuery(bQuery); 

더 나은, 더 elegent이 있다면 내가 부탁 해요 해결책?

감사합니다.

답변

2

카이엔의 우호적 인 메일 링리스트에서 비슷한 질문을했습니다. 당신은 see here 수 있습니다.

관계가 매우 큰 데이터를 반환하지 않는 한 Java에서 관계 및 필터를 통해 이동하는 것이 좋습니다. 전체 목록이 메모리에 저장되고 다음 번에 관계를 사용할 때 이점을 얻을 수 있으므로 DB를 사용할 필요가 없습니다.

는 대답은 모두 DB로 여행을 필요로 여기

인용된다.

  1. (관계 탐색 접근법) DB에서 그룹을 폴트하기 위해 DB로 한 번 트립해야하지만 그 다음에 메모리에 저장됩니다.

  2. (필터 접근 방식의 쿼리) 매번 DB 로의 이동이 필요하므로 매칭 횟수가 더 적더라도 장기적으로 느려질 수 있습니다. 이 한 번만 일어나는 일이고 당신이 정말로 성능에 대한 우려되는 경우

(그리고 아마도 그룹의 여지가), 나, 그렇지 않으면 1, 은 # 2로 가고 싶어. # 1을 조금이라도 최적화 할 수 있으므로 을 확인할 때마다 반복 할 필요가 없습니다.

via : Michael Gentry

관련 문제