2016-08-29 12 views
0

介して2つのJPAエンティティを結合するとき、私は、2つのJPAエンティティ無効別名JPA 2.0 CriteriaBuilder

class A{ 
    @OneToMany 
    Lis<B> entitiesB; 
    @Column("STATUS") 
    String status;// will sort based on this column 
} 

class B{ 
    @ManyToOne 
    A entityA; 
    @Column("PROPERTY_ONE") 
    String propertyOne; 
    .... 
    @Column("PROPERTY_M") 
    String propertyM; 
    .... 
} 

を有します私は次の基準を持っています:

Join<A, B>root=criteriaBuilder 
.createQuery(A.class) 
.from(A.class) 
.join("entitiesB"); 

CriteriaQuery<A> query = criteriaBuilder.createQuery(A.class); 

query.select(query.from(A.class).join("entitiesB")) 
     .distinct(true) 
     .where(formWhereClause(filters)) 
     .orderBy(formOrderByClause()); 

statusそれは私に次のSQL Aエンティティ

criteriaBuilder.notEqual(root.get("A").get("status"), "SOME_STATUS_VALUE"); 

からプロパティ生成されています:

'org.springframework.dao.InvalidDataAccessApiUsageException: org.hibernate.hql.internal.ast.QuerySyntaxException: 
Invalid path generatedAlias2.A.status ' 

私はそれをどのように修正することができます:私は次の例外を得た

select distinct generatedAlias0 from A as generatedAlias1 
inner join generatedAlias1.entitiesB as generatedAlias0 
where (generatedAlias2.A.status<>:param0) and (generatedAlias2.propertyOne like :param1) 
order by generatedAlias2.propertyM desc 

に?私は永続化プロバイダとしてHibernate 4.3.5を使用しています。

答えて

1

CriteriaQuery query = criteriaBuilder.createQuery(A.class);

は、タイプAのインスタンスを返すことを意味します。したがって、あなたのselect句ではなく、あなたがしたようJoinのインスタンスのクエリのルートを指定する必要があります。join方法のみRootまたはJoinタイプのインスタンスのいずれかを適用することができますので、

  1. は、クエリのルートを定義します。

    Root<A> root = query.from(A.class); 
    
  2. I need to left join A with B)参加定義します

    Join<A, B> b = root.join("entitiesB", JoinType.LEFT); 
    
  3. SELECT句に定義します。私は、エンティティからステータスプロパティによってフィルタを形成するにはどうすればよい

    query.select(root) 
    .distinct(true) 
    .where(formWhereClause(filters)) 
    .orderBy(formOrderByClause()); 
    

フォームは、次のことのように:

criteriaBuilder.notEqual(root.get("status"), "SOME_STATUS_VALUE"); 

と属性を使用する場合は例えば、

criteriaBuilder.equal(b.get("propertyOne"), "SOME_VALUE"); 
のように、フィルタとして Bを定義します。
関連する問題