对于映射到java.lang.Class

时间:2018-06-26 05:58:50

标签: java hibernate orm

我们正在将Hibernate用于ORM,并尝试映射java.lang.Class类型的列。列已正确映射,但无法在where子句中使用列“ type”进行查询。

我们有以下实体

@Entity
@Table(name = "my_entities")
public class MyEntity {

    private Class type;

    @Column(name = "type")
    public Class getType() {
        return type;
    }

    // setter

}

和带有查询的方法

public MyEntity get(Class clazz) {
     Session session = sessionFactory.getCurrentSession();
     Criteria criteria = session.createCriteria(MyEntity.class); 

     criteria.add(Restrictions.eq("type", clazz));

     return (MyEntity) criteria.uniqResult();
}  

结果是此异常

Caused by: org.hibernate.QueryException: Unsupported discriminator type null
    at org.hibernate.loader.criteria.CriteriaQueryTranslator.getTypedValue(CriteriaQueryTranslator.java:613) ~[CriteriaQueryTranslator.class:4.3.11.Final]
    at org.hibernate.criterion.SimpleExpression.getTypedValues(SimpleExpression.java:116) ~[SimpleExpression.class:4.3.11.Final]
    at org.hibernate.loader.criteria.CriteriaQueryTranslator.getQueryParameters(CriteriaQueryTranslator.java:346) ~[CriteriaQueryTranslator.class:4.3.11.Final]
    at org.hibernate.loader.criteria.CriteriaLoader.list(CriteriaLoader.java:126) ~[CriteriaLoader.class:4.3.11.Final]
    at org.hibernate.internal.SessionImpl.list(SessionImpl.java:1718) ~[SessionImpl.class:4.3.11.Final]
    at org.hibernate.internal.CriteriaImpl.list(CriteriaImpl.java:380) ~[CriteriaImpl.class:4.3.11.Final]

1 个答案:

答案 0 :(得分:0)

这似乎是Jira中的问题。

您可以通过仅将类名称存储在数据库中并在创建时来回转换来避开该问题。

@Column(name = "type")
private String type;

public void setType(Class clazz){
    this.type = clazz.getName();
}

public Class getType() {
    return Class.forName(type); //Exception handling omitted
}

在您的DAO中:

public MyEntity get(Class clazz) {
    return getCurrentSession().createCriteria(MyEntity.class)
      .add(Restrictions.eq("type", clazz.getName())).uniqueresult();