0

Serializable として宣言された永続フィールドを持つエンティティがあります。

Serializable フィールドで結果をフィルタリングする CriteriaBuilder を使用してクエリを作成したいと思います。データベースは Oracle で、hbm2ddl で定義されているように、フィールド タイプは RAW(255) です。

プレーンな JPQL TypedQuery を使用してクエリを作成すると、すべて正常に動作します (Serializable フィールドは "entityId" という名前のフィールドです)。

    TypedQuery<Change> query = em.createQuery("FROM Change c WHERE c.entityClass = :class AND c.entityId = :id", Change.class);
    query.setParameter("class", Person.class.getName());
    query.setParameter("id", new Integer(2287));
    query.getResultList();

ただし、基準ビルダーを使用したまったく同じクエリは機能しません。

    final CriteriaBuilder builder = em.getCriteriaBuilder();
    final CriteriaQuery<Change> criteriaQuery = builder.createQuery(Change.class);
    final Root<Change> from = criteriaQuery.from(Change.class);
    final CriteriaQuery<Change> select = criteriaQuery.select(from);
    final List<Predicate> predicates = new ArrayList<>();
    predicates.add(builder.equal(from.get("entityClass"), Person.class.getName()));
    predicates.add(builder.equal(from.get("entityId"), new Integer(2287)));
    select.where(predicates.toArray(new Predicate[predicates.size()]));
    final TypedQuery<Change> query = em.createQuery(select);
    query.getResultList();

getResultList() を呼び出した後、次の例外をスローします。

[2013-05-21 16:12:45,960] [com.mycompany.myproduct.server.Main.startServer(Main.java:56)] [ERROR] [main] - Error starting Server: org.hibernate.exception.SQLGrammarException: could not extract ResultSet
javax.persistence.PersistenceException: org.hibernate.exception.SQLGrammarException: could not extract ResultSet
    at org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1387)
...
Caused by: org.hibernate.exception.SQLGrammarException: could not extract ResultSet
...
Caused by: java.sql.SQLSyntaxErrorException: ORA-00932: inconsistent datatypes: expected BINARY got NUMBER    
    at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:445)
...

変更.java :

@Entity
@Table(name = "T_REVISION_CHANGE")
@SequenceGenerator(name = "seq_revision_change", sequenceName = "SEQ_REVISION_CHANGE", allocationSize = 1)
public class Change {

    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "seq_revision_change")
    private Integer id;

    @Column(name = "ENTITY_CLASS")
    private String entityClass;

    @Column(name = "ENTITY_ID")
    private Serializable entityId;

}

整数を手動でシリアル化しようとしましたが、バイト配列ではなくシリアル化可能なインスタンスが期待されているという同じ種類の例外がスローされました... :)

どんなコメントでも大歓迎です。

4

0 に答える 0