2016-09-28 2 views
0

속성과 관계가 자체적으로 정의 된 속성과 일부 수퍼 클래스에서 상속 된 속성이있는 "주소"라는 간단한 엔티티가 있습니다. 내가 달성하기 위해 노력하고있어null 값을 포함하는 열의 기준 API createAlias가 쿼리를 죽입니다.

public class Base { 
    private UUID id; 
    private Date createdAt; 
    @NotNull 
    private User createdBy; // User is a related Entity that cannot be null 
    private DataImport dataImport; // DataImport is another related entity that can be null 
    //getter & setter 
} 

public class Address extends Base { 
    private String street; 
    @NotNull 
    private Country country; // related entity that can't be null 
    //getter & setter 
} 

하나 개의 쿼리가 기준 API를 사용하여, 나는 거리와 createdAt 같은 모든 단순 속성이 포함 된 주소 오브젝트의 목록을 얻을 싶어요. 동시에 관련된 엔터티의 ID (createdBy.id, dataImport.id 및 country.id) 만 필요합니다.

나는 거의 다음과 같은 기준 쿼리를 사용하고

:

entityManager.getDelegate().createCriteria(Address.class).add(criteriaExample) 
.excludeZeroes() 
.createAlias("createdBy", "subcreatedBy") 
.createAlias("country", "subcountry") 
.setProjection(Projections.projectionList().add(Projections.property("id").as("id")) 
    .add(Projections.property("createdAt").as("createdAt")) 
    .add(Projections.property("street").as("street")). 
    .add(Projections.property("subcreatedBy.id").as("createdBy.id")) 
    .add(Projections.property("subcountry.id").as("country.id"))) 
    .setResultTransformer(new AliasToBeanNestedResultTransformer(Address.class)); 

List<Address> result = criteria.list(); 

이 바로 완벽한 작품!

dataImport 관계에 "별칭"만 추가 할 때 문제가 발생합니다.

...createAlias("dataImport", "subdataImport")... 

에도 쿼리에 dataImport.id의 투사를 추가하지 않고, 그것을 최대한 빨리이 별칭을 추가로,()는 list.size를 의미하는 빈 목록을 반환 = 0.

nullable 속성에 별칭을 추가 할 수 없다는 현재 추측입니다. 아무도 해결책이 무엇 일지 모르는가? 그래서 관련 엔터티가 null이 아니면 ID를 얻고 싶습니다. 그리고 관계가 설정되지 않은 경우 단순히 null이되기를 원합니다.

미리 감사드립니다.

답변

0

바보가 문서를 읽고 CriteriaSpecification.LEFT_JOIN을 설정해야합니다.

...createAlias("dataImport", "subdataImport", CriteriaSpecification.LEFT_JOIN)...