Как сделать запрос по встроенному примеру, содержащему нулевые значения, используя hibernate? - PullRequest
3 голосов
/ 04 марта 2010

У меня проблема с запросом, использующим спящий режим. Класс сущности 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, если это поможет.

Ответы [ 2 ]

2 голосов
/ 05 марта 2010

Э-э, я понял:

После отладки кода гибернации я обнаружил, что вам нужно построить пример на классе сущностей. Поэтому я создал пример экземпляра сущности, установил внедренное значение и исключил неиспользуемые свойства по критерию Пример:

Criteria query = getSession().createCriteria(EntityClass.class);
EntityClass example = new EntityClass();
example.setEmbedded(embedded);
query.add(Example.create(example).excludeNone()
    .excludeProperty("id").excludeProperty("other"));
return (EntityClass) query.uniqueResult();
0 голосов
/ 05 марта 2010

Просмотрите ограничение isNull для ваших критериев. Я думаю, что это работает для каждой сессии:

Criteria entityCriteria = getSession().createCriteria(EntityClass.class);
entityCriteria.add(Restrictions.isNull("optional")); // isNull restriction on the optional attribute of your EntityClass
List results = entityCriteria.list();
...