2016-09-28 3 views
0

У меня есть простой объект с именем «Адрес», который имеет пару свойств и отношений, определенных самим собой, а некоторые - унаследованные от некоторого суперкласса.Критерии 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 
} 

То, что я пытаюсь достичь с один запрос с использованием Criteria API, я хочу, чтобы получить список адресов объектов, содержащих все простые атрибуты, как улицы и createdAt. В то же время я хочу только идентификаторы связанных объектов, если они есть: 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, когда отношение не установлено.

Заранее спасибо.

ответ

0

Глупый я должен был прочитать документацию и установить CriteriaSpecification.LEFT_JOIN.

...createAlias("dataImport", "subdataImport", CriteriaSpecification.LEFT_JOIN)... 
Смежные вопросы