使用和SQL查询的基本Hibernate问题

时间:2010-05-15 23:16:50

标签: java hibernate java-ee

我有一个包含3个属性Personfirstnamelastname的java对象username

我有一个Oracle存储过程返回一个包含3列的结果集。 一切正常。

现在我有另一个存储过程,它只返回firstname和lastname而不是username。

我收到以下错误:

  

无法从结果集用户名

中读取列值

Hibernate尝试从结果集中获取用户名属性。 如果我删除属性用户名,那么它的工作原理。

我的配置:

<sql-query name="normalise" callable="true" >
<return alias="val" class="com.nbfg.sipc.model.Person">
<return-property name="firstname" column="FIRST_NAME"/>
<return-property name="lastname" column="LASTNAME_NAME"/>
</return>
{call SCHSIPC.PKG_SIPC_APP.PRC_SIPC_NORMALISE_RS(?, ?, ?, ?, ?) }
</sql-query>

我的Pojo(没有注释)

@Entity
public class Person {

    private String firstname;
    private String lastname;
    private String username;
...

电话:

private Value call(String app, String cat, String col, String valeure, String query) {
    try {
        Query q = getSessionFactory().openStatelessSession().getNamedQuery(query);
        q.setString(0, app).setString(1, cat).setString(2, col).setString(3, valeure);
        return (Person) q.list().get(0);
    } catch (org.hibernate.QueryTimeoutException ex) {
        throw new IllegalArgumentException(ex.getCause().getMessage());
    }
}

如果我从Pojo中删除属性username,一切正常。我可以重复使用相同的PoJo吗?

谢谢

2 个答案:

答案 0 :(得分:2)

感谢您的代码。我不是100%肯定这一点,但我相信使用Hibernate SQL查询必须返回您希望查询实例化的对象的所有字段。

您可能想要尝试的另一种解决方案是依赖HQL并根据需要实例化对象。例如,从Person p中选择新的Person(firstName,lastName),其中p.username = ... 这实际上允许您在查询中使用任何类型(具有匹配类型的字段)。

这将解决您的直接问题,但我不确定如何在此方案中解决存储过程的使用问题。希望这可以帮助。

答案 1 :(得分:0)

我是客人,如果我们说没有办法告诉Hibernate只读取StoreProcedur返回的ResultSet中的某些列,并且我需要为每种类型的结果集创建一个单独的POJO,那么这就是答案。

如果这样对吗?