Hibernate在查询Oracle视图时使用空值返回列表

Hibernate在查询Oracle视图时使用空值返回列表,hibernate,Hibernate,当使用Hibernate 4查询Oracle视图时,我会返回一个大于0的列表,表示在SQL Developer中运行相同查询时得到的元素数。然而,当我在列表中循环时,我只得到空值 我的hibernate.cfg.xml如下所示: <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD

当使用Hibernate 4查询Oracle视图时,我会返回一个大于0的列表,表示在SQL Developer中运行相同查询时得到的元素数。然而,当我在列表中循环时,我只得到空值

我的hibernate.cfg.xml如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
    "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
    "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
    <property name="hibernate.connection.driver_class">oracle.jdbc.driver.OracleDriver</property>

    <property name="hibernate.connection.url">jdbc:oracle:thin:@127.0.0.1:1521:OUT</property>
    <property name="hibernate.connection.username">username</property>
    <property name="hibernate.connection.password">password</property>
    <property name="hibernate.default_schema">schema</property>

    <property name="hibernate.dialect">org.hibernate.dialect.Oracle10gDialect</property>

    <property name="hibernate.connection.pool_size">1</property>

    <property name="hibernate.current_session_context_class">thread</property>

    <property name="hibernate.cache.provider_class">org.hibernate.cache.NoCacheProvider</property>
    <property name="hibernate.hbm2ddl.auto">update</property>

    <mapping resource="be/comp/model/db/VwPersoneelslid.hbm.xml"/>
</session-factory>
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<!-- Generated 9-aug-2013 10:13:31 by Hibernate Tools 4.0.0 -->
<hibernate-mapping>
<class name="be.comp.model.db.VwPersoneelslid" table="VW_PERSONEELSLID">
    <composite-id name="id" class="be.comp.model.db.VwPersoneelslidId">
        <key-property name="pkVwPersoneelslid" type="double">
            <column name="PK_VW_PERSONEELSLID" precision="126" scale="0" />
        </key-property>
        <key-property name="fkVwFunctie" type="double">
            <column name="FK_VW_FUNCTIE" precision="126" scale="0" />
        </key-property>
        <key-property name="familienaam" type="string">
            <column name="FAMILIENAAM" length="80" />
        </key-property>
        <key-property name="voornaam" type="string">
            <column name="VOORNAAM" length="80" />
        </key-property>
        <key-property name="code" type="string">
            <column name="CODE" length="10" />
        </key-property>

    </composite-id>
</class>

oracle.jdbc.driver.OracleDriver
jdbc:oracle:thin:@127.0.0.1:1521:OUT
用户名
密码
模式
org.hibernate.dialen.oracle10galent
1.
线
org.hibernate.cache.NoCacheProvider
更新

vwPersonelSlid.hbm.xml看起来像:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
    "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
    "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
    <property name="hibernate.connection.driver_class">oracle.jdbc.driver.OracleDriver</property>

    <property name="hibernate.connection.url">jdbc:oracle:thin:@127.0.0.1:1521:OUT</property>
    <property name="hibernate.connection.username">username</property>
    <property name="hibernate.connection.password">password</property>
    <property name="hibernate.default_schema">schema</property>

    <property name="hibernate.dialect">org.hibernate.dialect.Oracle10gDialect</property>

    <property name="hibernate.connection.pool_size">1</property>

    <property name="hibernate.current_session_context_class">thread</property>

    <property name="hibernate.cache.provider_class">org.hibernate.cache.NoCacheProvider</property>
    <property name="hibernate.hbm2ddl.auto">update</property>

    <mapping resource="be/comp/model/db/VwPersoneelslid.hbm.xml"/>
</session-factory>
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<!-- Generated 9-aug-2013 10:13:31 by Hibernate Tools 4.0.0 -->
<hibernate-mapping>
<class name="be.comp.model.db.VwPersoneelslid" table="VW_PERSONEELSLID">
    <composite-id name="id" class="be.comp.model.db.VwPersoneelslidId">
        <key-property name="pkVwPersoneelslid" type="double">
            <column name="PK_VW_PERSONEELSLID" precision="126" scale="0" />
        </key-property>
        <key-property name="fkVwFunctie" type="double">
            <column name="FK_VW_FUNCTIE" precision="126" scale="0" />
        </key-property>
        <key-property name="familienaam" type="string">
            <column name="FAMILIENAAM" length="80" />
        </key-property>
        <key-property name="voornaam" type="string">
            <column name="VOORNAAM" length="80" />
        </key-property>
        <key-property name="code" type="string">
            <column name="CODE" length="10" />
        </key-property>

    </composite-id>
</class>

带有查询的函数是:

public List<VwPersoneelslid> findByCode(String code)
{
    Session session = HibernateUtil.getSessionFactoryNeptunus().getCurrentSession();
    session.beginTransaction();

    List<VwPersoneelslid> list = new ArrayList();

    Query query = session.createQuery("FROM VwPersoneelslid WHERE code = :code"); 
    query.setParameter("code", code);
    list = query.list();

    session.getTransaction().commit();

    return list;
}
公共列表findByCode(字符串代码)
{
Session Session=HibernateUtil.getSessionFactoryNeptunus().getCurrentSession();
session.beginTransaction();
列表=新的ArrayList();
Query Query=session.createQuery(“来自VwPersonelSlid,其中代码=:code”);
query.setParameter(“code”,code);
list=query.list();
session.getTransaction().commit();
退货清单;
}
转换为本机SQL的函数:

public List<VwPersoneelslid> findByCode(String code)
{
    Session session = HibernateUtil.getSessionFactoryNeptunus().getCurrentSession();
    session.beginTransaction();

    List<VwPersoneelslid> list = new ArrayList();

    Query query = session.createSQLQuery("SELECT * FROM CIPALII.VW_PERSONEELSLID WHERE code = :code").addEntity(VwPersoneelslid.class)
            .setParameter("code", code);

    list = query.list();

    session.getTransaction().commit();

    return list;
}
公共列表findByCode(字符串代码)
{
Session Session=HibernateUtil.getSessionFactoryNeptunus().getCurrentSession();
session.beginTransaction();
列表=新的ArrayList();
Query Query=session.createSQLQuery(“从CIPALII.VW_personelslid中选择*,其中代码=:code”).addEntity(vwpersonelslid.class)
.设置参数(“代码”,代码);
list=query.list();
session.getTransaction().commit();
退货清单;
}

如果你们需要更多的信息来了解可能的问题,请让我知道,我添加更多的代码。vwPersonelslid.hbm.xml文件由Eclipse自动生成。谢谢。

Hibernate HQL查询处理实体。视图是数据库或SQL模式的概念。当我们使用HQL查询数据时,我们会提到实体名称和实体属性。因此,如果您想从视图进行查询,请将核心SQL查询与Hibernate一起使用,而不是使用HQL查询。

首先:很抱歉格式不好,但在我的3英寸屏幕上,移动写入e是一件痛苦的事……
在我看来,问题在于您的实体仅由id组成。Hibernate可能会在查询期间获取id,并找到有效数量的对象(您的列表大小),但当在脱水期间将id转换为映射实体时,它会在获取真实数据和构建实体时遇到问题(可能hibernate正在获取除属于id一部分的属性之外的其他属性,并且遇到了一种从表中选择null的方法,其中id字段=预取id-这只是一个想法;这就是为什么会得到一个填充null的列表)。若您可以重新考虑复合id或尝试向实体添加更多属性。希望可以帮助解决或指向解决方案。Hibernate工具有时会生成奇怪的映射。。。 除此之外,使用本机查询、addScalar()(而不是addEntity)和aliastobean resulttransformer可能是一种解决方法(如果您映射的是只读视图,这是合理的)

使用SQLQuery:

session.createSQLQuery(“选择pkVwPersoneelslid、fkVwFunctie、familienaam、voornaam、来自VW_PERSONEELSLID的代码,其中代码=:code”)
.setParameter(“代码”,代码)
.addScalar(“pkvPersonelSlid”,DoubleType.INSTANCE)
.addScalar(“FKVWFuncie”,DoubleType.INSTANCE)
.addScalar(“familienaam”,StringType.INSTANCE)
.addScalar(“voornaam.StringType.INSTANCE”)
.addScalar(“代码”.StringType.INSTANCE)
.setResultTransformer(新别名为BeanResultTransformer(vwPersonelSlid.class))
.list();


你需要空的构造函数和setter/getter;来回答任何关于check-SO的问题。

我设法创建了一个解决方法。至少对我来说,问题在于Hibernate工具创建了复合id。如果不跳过几个环,我无法正确工作。因此我设法摆脱了复合id。In我添加的my reveng.xml文件:

<table name="VW_PERSONEELSLID">
    <primary-key>
        <key-column name="PK_VW_PERSONEELSLID" />
    </primary-key>
</table>


这将生成一个id(PK_VW_personelslid),并允许我继续使用Hibernate工具。我不知道这是否是一个脏补丁。我可能会在几天内发现这一点。

如果您知道您正在查询的列可能包含空值,那么我建议您将NVL(ColumnName,value)添加到查询中

例如:

session.createSQLQuery("select NVL(size,0) as size from randomTable")

  .addScalar("size",StandardBasicType.INTEGER)
  .setResultTransformer(Transformers.aliasToBean(randomTableClass.class))
  .list();
您也可以使用COALESCE

session.createSQLQuery("select COALESCE(size,0) as size from randomTable")
这解决了我的问题


如果我错了,请纠正我。

您执行的查询是什么?@HenrykKonsek我用该查询编辑了我的问题。Where is defined property
vwPersonelslid.code
?@bellabox我编辑了我的帖子并包含了代码字段。我不小心删除了它以减小vwPersonelslid.hbm.xml文件的大小。我已转换了查询到一个核心SQL查询(见我在底部的原始帖子)。但我仍然得到空的。尝试使用
SQLQuery
接口而不是
query
。你能给我一个例子吗?SQLQuery query=session.createSQLQuery(“SELECT*FROM CIPALII.VW_personelslid WHERE code=:code”);query.setParameter(“code”,code);我尝试了你的代码。现在,当我使用迭代器循环对象并调用next()方法时,我得到了错误:线程“main”java.lang.ClassCastException中的异常:[Ljava.lang.object;不能转换为be.ocmwturnhout.model.neptunus.vwPersonelSlid at be.ocmwturnhout.permanenties.main.main(main.java:73)你能给我举个例子吗?我不是一个写例子的人,但[这里]()你可以找到addScalar()的例子和resultTransformer的16.1.5点;当我向查询中添加addScalar()时,我得到以下错误:线程中的异常“main”“java.lang.ClassCastException:java.lang.String不能在be.comp.permanenties.Main.ma处转换为be.comp.model.neptunus.vwPersonelslid