从query.getResultList

时间:2018-06-25 09:52:54

标签: oracle hibernate classcastexception

我创建了一个小型SpringBoot应用程序,该应用程序与Hibernate一起用于我们的Oracle Databse。

但是我遇到了以下问题:

每当我使用SessionFactory.createQuery()然后从query.getResultList()从数据库加载对象时。我确实获得了带有正确的Class批注的结果列表(在调试模式下查看代码时)。但是,即使列表是MyClass列表,我也无法执行MyClass x = list.get(0)。我只能得到一个对象,但不能“广播”到正确的类。

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;
}

位于eu.lbase.invsvc.app.model.internal包中的src / main / resources下的Uidnr.hbm.xml文件:

<?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

0 个答案:

没有答案