Hibernate ClassCastException при получении класса из query.getResultList - PullRequest
0 голосов
/ 25 июня 2018

Я создал небольшое приложение SpringBoot, которое используется вместе с Hibernate для работы с Oracle Databse.

Но я столкнулся со следующей проблемой:

Всякий раз, когда я загружаю объект из базы данных с помощью SessionFactory.createQuery (), а затем query.getResultList (). Я получаю список результатов с правильными аннотациями класса (при просмотре кода в режиме отладки). Но я не могу сделать MyClass x = list.get (0), даже если список является списком MyClass. Я могу получить только Объект, но не могу «привести» к правильному классу.

Uidnr - это простой класс без таблиц соединения или каких-либо других зависимостей от других таблиц из базы данных. Это только BigDecimal, String и Timestamp.

Вот код и конфиги всего:

Конечная точка POST:

@RequestMapping(value = "/e10", method = RequestMethod.POST, produces = MediaType.APPLICATION_XML_VALUE)
@ResponseBody
public String e10() {

  Database db = new Database();
  List<Uidnr> bel = db.getUidnrList(new BigDecimal("1009316"));
  Uidnr element = bel.get(0); //CLASSCASTEXCEPTION HERE!!!

  return element.getNr();
}

Метод получения класса из базы данных:

public List<Uidnr> getUidnrList(BigDecimal id) {

   SessionFactory factory = null;
   List<Uidnr> uidnr = new ArrayList<Uidnr>();
   Session session = null;

   try {

      factory = getSessionFactory();
      session = factory.openSession();

      Query<Uidnr> query = session.createQuery("from Uidnr where adrid=:sblid", Uidnr.class);
      query.setParameter("sblid", id);
      uidnr = query.getResultList(); //This is a List<Uidnr

   } catch (HibernateException ex) {
      logger.error("Error loading Sendungen.", ex);
   } finally {
      close(factory, session);
   }

   return uidnr;
}

SessionFactory:

private SessionFactory getSessionFactory() {

  SessionFactory sf = null;
  File optextconf = new File("conf/hibernate.cfg.xml");
  Configuration c = new Configuration();

  if (optextconf.exists()) {
     c.configure(optextconf);
     c.addResource("eu/lbase/invsvc/app/model/internal/Uidnr.hbm.xml");
     sf = c.buildSessionFactory();
     logger.info("Session factory loaded from external file {}.", optextconf.getAbsolutePath());
  } else {
     logger.error("Configuration {} not found. Can not connect to database.", optextconf.getAbsolutePath());
  }
  return sf;
}

Файл Uidnr.hbm.xml, расположенный в каталоге src / main / resources, в пакете с именем eu.lbase.invsvc.app.model.internal:

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
    <class name="eu.lbase.invsvc.app.model.internal.Uidnr" table="SUID_UIDNR">
        <composite-id>
            <key-property name="adrid" column="UID_ADRID" />
            <key-property name="staid" column="UID_STAID" />
        </composite-id>
        <property name="nr" column="UID_NR"/>
        <property name="stnr" column="UID_STNR"/>
        <property name="deflt" column="UID_DEFLT"/>
        <property name="aend" column="UID_AEND"/>
        <property name="usrid" column="UID_USRID"/>
        <property name="stktonr" column="UID_STKTONR"/>
        <property name="zoktonr" column="UID_ZOKTONR"/>
        <property name="vollmacht" column="UID_VOLLMACHT"/>
    </class>
</hibernate-mapping>

Исключение:

java.lang.ClassCastException: eu.lbase.invsvc.app.model.internal.Uidnr cannot be cast to eu.lbase.invsvc.app.model.internal.Uidnr
at eu.lbase.invsvc.app.controller.WebController.e10(WebController.java:91) ~[main/:na]

Некоторые тесты:

System.out.println(bel.getClass()); //class java.util.ArrayList
Object test = bel.get(0);
System.out.println(test.getClass()); //class eu.lbase.invsvc.app.model.internal.Uidnr
System.out.println(bel.get(0) instanceof eu.lbase.invsvc.app.model.internal.Uidnr); //false
...