У меня проблема с запросом, использующим спящий режим. Класс сущности EntityClass
имеет встроенное свойство embedded
типа EmbeddedClass
, а это свойство имеет свойство NULL. optional
. Когда все свойства установлены, я могу сделать очень простой запрос HQL как:
Query query = getSession().createQuery(
"FROM EntityClass t WHERE t.embedded = :embedded");
query.setParameter("embedded", embedded);
return (EntityClass) query.uniqueResult();
Но когда свойство optional
равно нулю, это не работает, потому что hibernate создает SQL-запрос, такой как t.optional=?
, но =NULL
должен быть IS NULL
в SQL. Предложение WHERE никогда не совпадает, запрос не возвращает строк.
Некоторое дальнейшее чтение указывало на Пример, который правильно обрабатывает нуль. Теперь мой код выглядит так:
Criteria query = getSession().createCriteria(EntityClass.class);
query.createCriteria("embedded").add(Example.create(embedded));
return (EntityClass) query.uniqueResult();
При запуске кода я получаю ClassCastException
:
java.lang.ClassCastException: EmbeddedClass
at org.hibernate.criterion.Example.getEntityMode(Example.java:279)
at org.hibernate.criterion.Example.toSqlString(Example.java:209)
at org.hibernate.loader.criteria.CriteriaQueryTranslator.getWhereCondition(CriteriaQueryTranslator.java:357)
at org.hibernate.loader.criteria.CriteriaJoinWalker.<init>(CriteriaJoinWalker.java:113)
at org.hibernate.loader.criteria.CriteriaJoinWalker.<init>(CriteriaJoinWalker.java:82)
at org.hibernate.loader.criteria.CriteriaLoader.<init>(CriteriaLoader.java:91)
at org.hibernate.impl.SessionImpl.list(SessionImpl.java:1577)
at org.hibernate.impl.CriteriaImpl.list(CriteriaImpl.java:306)
at org.hibernate.impl.CriteriaImpl.uniqueResult(CriteriaImpl.java:328)
Это как-то связано с EntityPersister.guessEntityMode()
, возвращающим ноль, потому что hibernate ищет отображение класса сущности, а не встроенного.
Кажется, что org.hibernate.criterion.Example нельзя использовать для встроенного класса. Есть идеи, как это сделать? Есть ли другой подход?
Классы выглядят так:
@Entity
public class EntityClass {
...
@Embedded
private EmbeddedClass embedded;
...
}
@Embeddable
public class EmbeddedClass {
private String name;
private String optional;
...
}
Я использую hibernate 3.3.1 и оракула 10g, если это поможет.