2016-09-28 2 views
0

プロパティといくつかのスーパークラスから継承されたいくつかのプロパティとリレーションを持つ単純なエンティティ "Address"があります。私が達成しようとしている何null値を含む列のCriteria 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を使用して1つのクエリであり、私は通りと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。

私の現在の推測は、null可能なプロパティにエイリアスを置くことができないということです。誰かが解決策が何であるか考えていますか?したがって、関連エンティティがnullでない場合、IDを取得したいと思います。そして、関係が設定されていないときは、単純にnullにします。

ありがとうございます。

答えて

0

私はドキュメントを読んで、CriteriaSpecification.LEFT_JOINを設定する必要があります。

...createAlias("dataImport", "subdataImport", CriteriaSpecification.LEFT_JOIN)... 
関連する問題