1

追加のON句パラメータと結合する方法は?私はSQLを持っています:

select * from Address address left outer join  AddressLine line 
              on line.id = address.lineId AND line.type = 'MA'
where address.id = 1;

私はコードを持っています:

CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<AddressResult> query = cb.createQuery(AddressResult.class);
Root<Address> r = query.from(Address.class);
Join<Address, AddressLineMA >linesMA= r.join(Address_.linesMajor, JoinType.LEFT);

データベースからデータを取得します。このクエリは期待どおりに機能していません。次のようなSQLを取得します。

select * from Address address left outer join  AddressLine line 
              on line.id = address.lineId 
    where address.id = 1;

AND line.type='MA'がありません。誰かがこれを修正する方法を知っていますか?

私のAddressLineMA.classは次のようになります。

@Entity
@DiscriminatorValue(value = "MA")
public class AddressLineMA extends AddressLine {

}
@Entity
@Table(name = "AddressLine")
@DiscriminatorColumn(name = "TYPE", discriminatorType = DiscriminatorType.STRING)
public abstract class AddressLine {
   private Long id;
   private String type;
   private String line;
}
4

1 に答える 1

4

JPAクエリは、デフォルトで常にすべてのサブクラスを返します。したがって、AddressLineMAのインスタンスのみが必要な場合は、クエリと関係を、継承ルートクラスであるAddressLineではなくAddressLineMA上にあるように変更する必要があります。

除外したいAddressLineMAの他のサブクラスがある場合は、JPA2.0に追加されたTYPE演算子を使用できます。

   query.where(cb.equal(linesMA.type(), package.AddressLineMA.class));

残念ながら、ON句への追加は、まだリリースされていないJPA2.1仕様でのみサポートされています。

   linesMA.on(cb.equal(linesMA.type(), package.AddressLineMA.class));
于 2013-02-04T18:58:39.350 に答える