Неподдерживаемый тип дискриминатора null для запроса по столбцу, сопоставленному с java.lang.Class - PullRequest
0 голосов
/ 26 июня 2018

Мы используем Hibernate для ORM и пытаемся отобразить столбец типа java.lang.Class.Столбец отображается правильно, но невозможно выполнить запрос, используя столбец «тип» в предложении where.

У нас есть следующий объект

@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 голосов
/ 27 августа 2018

Похоже, что это проблема в 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
}

А в вашем ДАО:

public MyEntity get(Class clazz) {
    return getCurrentSession().createCriteria(MyEntity.class)
      .add(Restrictions.eq("type", clazz.getName())).uniqueresult();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...