代码之家  ›  专栏  ›  技术社区  ›  Arne Burmeister

如何使用hibernate通过包含空值的嵌入式示例进行查询?

  •  3
  • Arne Burmeister  · 技术社区  · 14 年前

    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();
    

    但是当财产 可选择的 t.optional=? 但是 =NULL 应该是 IS NULL

    一些进一步的阅读指出了正确处理null的示例。现在我的代码看起来像:

    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() 返回null,因为hibernate查找实体类的映射,而不是嵌入类的映射。

    似乎org.hibernate.criteria.Example不能用于嵌入式类。你知道怎么做吗?有其他方法吗?

    这些类看起来像:

    @Entity
    public class EntityClass {
        ...
    
        @Embedded
        private EmbeddedClass embedded;
    
        ...
    }
    
    @Embeddable
    public class EmbeddedClass {
        private String name;
        private String optional;
        ...
    }
    

    我使用hibernate3.3.1和oracle10g,如果有帮助的话。

    2 回复  |  直到 14 年前
        1
  •  2
  •   Rich    11 年前

    呃,我知道了:

    调试完hibernate代码后,我发现需要在entity类上构建示例。因此,我创建了实体的一个示例实例,设置嵌入值并排除了示例条件中未使用的属性:

    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();
    
        2
  •  0
  •   Mike Cialowicz    14 年前

    看看这个房间 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();