0

EclipseLink で JPA を使用してデータベース ルックアップを実行しようとしています。私のデータベースは Oracle 11.2.0 です。次のエンティティ クラスが定義されています。

@Entity
@Table(name = "BS_PROVIDERS")
public class BsProvider {

    @Id
    @Column(name = "GUID")
    private String guid;
    public String getGuid() { return guid; }
    public void setGuid(String guid) { this.guid = guid; }

    @Column(name = "NAME")
    private String name;
    public String getName() { return name; }
    public void setName(String name) { this.name = name; }

}

@Entity
@Table(name = "CP_PROVIDERS")
public class CpProvider{

    @Id
    @Column(name = "GUID")
    private String guid;
    public String getGuid() { return guid; }
    public void setGuid(String guid) { this.guid = guid; }

    @Column(name = "NAME")
    private String name;
    public String getName() { return name; }
    public void setName(String name) { this.name = name; }

}

@NamedQueries({
    @NamedQuery(
        name = Catalog.FIND_BY_CPP_AND_BSP,
        query = "select c from Catalog c where (c.cpProvider = :cpProvider) and ( (:bsProvider IS NULL) or (c.bsProvider = :bsProvider))"
        )
})
@Entity
@Table(name = "CATALOGS")
public class Catalog {

    public static final String FIND_BY_CPP_AND_BSP = "Catalog.findByCppAndBsp";
    public static final String CP_PROVIDER_PARAM = "cpProvider";
    public static final String BS_PROVIDER_PARAM = "bsProvider";

    @Id
    @Column(name = "GUID")
    private String guid;
    public String getGuid() { return guid; }
    public void setGuid(String guid) { this.guid = guid; }

    @Column(name = "NAME")
    private String name;
    public String getName() { return name; }
    public void setName() { this.name = name; }

    @ManyToOne
    @JoinColumn(name = "CPP_GUID")
    private CpProvider cpProvider;
    public CpProvider getCpProvider() { return cpProvider; }
    public void setCpProvider(CpProvider cpProvider) { this.cpProvider = cpProvider; }

    @ManyToOne()
    @JoinColumn(name = "BSP_GUIG")
    private BsProvider bsProvider;
    public BsProvider getBsProvider() { return bsProvider; }
    public void setBsProvider(BsProvider bsProvider) { this.bsProvider = bsProvider; }

}

クエリを作成してパラメーターを設定するコード:

TypedQuery<Catalog> catalogQuery = em.createNamedQuery(Catalog.FIND_BY_CPP_AND_BSP, Catalog.class);
catalogQuery.setParameter(Catalog.CP_PROVIDER_PARAM, cpProvider);
catalogQuery.setParameter(Catalog.BS_PROVIDER_PARAM, bsProvider);
List<Catalog> catalogList = catalogQuery.getResultList();

変数 bsProvider が NULL の場合、すべてのパラメーターが登録され、EclipseLink ログに従って正しく登録されます。

    SELECT GUID, NAME, BSP_GUIG, CPP_GUID FROM CATALOGS WHERE ((CPP_GUID = ?) AND ((? IS NULL) OR (BSP_GUIG = ?)))
        bind => [18EC0EDB-21A4-4845-960A-D5D2BDAC7B87, null, null]

それ以外の場合、変数 bsProvider が既存のエンティティを参照すると、次の例外が発生します。

Exception [EclipseLink-4002] (Eclipse Persistence Services - 2.3.2.v20111125-r10461): org.eclipse.persistence.exceptions.DatabaseException
Internal Exception: java.sql.SQLException: Invalid column type
Error Code: 17004
Call: SELECT GUID, NAME, BSP_GUIG, CPP_GUID FROM CATALOGS WHERE ((CPP_GUID = ?) AND ((? IS NULL) OR (BSP_GUIG = ?)))
    bind => [18EC0EDB-21A4-4845-960A-D5D2BDAC7B87, com.bssys.ebpp.dbaccess.model.BsProvider@5dbbe8df, 44E8F4BF-CFDC-49DB-AB0B-718C72D6B4EF]

ご覧のとおり、1 番目と 3 番目のパラメーターは正しくバインドされていますが (主キーの値に置き換えられています)、2 番目のパラメーターはバインドされていません。そのような奇妙な行動の理由は何ですか?

4

0 に答える 0