2014-12-12 2 views
0

일부 간단한 도메인 클래스를로드하고 저장하기 위해 Spring Data MongoDB를 사용하고 있습니다. 간단한 예는 말할 수로서 나는MongoDB 자체 저장소 인터페이스가있는 중첩 된 객체

@Document 
public class Factory { 
    @Id String id; 
    String name; 
    List<Product> products; 
} 

@Document 
public class Product { 
    @Id String id; 
    String name; 
    Date productionDate; 
} 

가 좋아, 아주 간단 지금 만들 수 있습니다 공장 및 제품을 가지고 FactoryRepository :

public interface FactoryQueryRepository extends MongoRepository<Factory, String> {} 

이 저장소는 이미 함께 기본적인 저장하는 CRUD 기능과로드의 공장을 가지고 중첩 된 제품. 이제 주어진 팩토리에 대해 일련의 제품 만 검색하려고한다고 가정 해 보겠습니다.

A) 어떻게 든 반환 할 수 제품 대신 지금처럼 FactoryQueryRepository 공장의 목록의 목록 :

@Query(value = "???") 
public List<Product> findProductByFactoryName(String name); 

나는 이제 두 개의 질문이 B) 내 공장에는 제품뿐만 아니라 직원, 고객, 공급 업체 등이 있습니다. 다음과 같이 몇 가지 특수한 쿼리 방법을 정의해야합니다. 각각의 중첩 된 컬렉션은 곧 매우 큰 FactoryQueryRepository 인터페이스로 끝납니다. 따라서 실제로 Product, Employee, Customer 등에 대해 새로운 ...QueryRepositoy을 만드는 것이 더 적절할 것입니다. 하지만이 작업을 시도 할 때 공장 내에서 중첩되지 않은 독립 실행 형 Product 객체를 먼저 저장하면 작동하는 것 같습니다.

public interface ProductQueryRepository extends MongoRepository<Product, String> { 
    @Query(/* select products from factory where name = '?0' */) 
    public List<Product> findProductsByFactoryName(String name); 
} 

: 나는 ProductQueryRepository 인터페이스를 정의 (비슷한 질문하기)와 공장의 일부 필터 기준이 뭔가를 지정하여 공장 안에 중첩 된 모든 제품을 검색하는 데 사용할 수있는 방법이 있나요 이 경우 Shoud I는 오히려 중첩 된 객체를 사용하는 것보다 @DBRef을 사용합니까?

답변

0

질문에 대한 답변 - MongoTemplate을 사용하여 사용자 지정 쿼리를 작성해야합니다.

당신의 질문에 B) MongoDB를 사용할 때 참조를 피하려고 노력해야합니다. MongoDB는 하나의 문서에 대한 원자 쓰기 만 보장합니다. 여러 문서에는 적용되지 않습니다. 참조를 사용해야하는 경우 DBRef를 사용하지 않아야합니다. 수동으로 참조를 구현해야합니다 (이것은에 명시되어 있습니다)