【问题标题】:Basic Hibernate issues using and SQL query使用和 SQL 查询的基本 Hibernate 问题
【发布时间】:2010-05-15 23:16:49
【问题描述】:

我有一个 java 对象 Person 具有 3 个属性 firstnamelastnameusername

我有一个 Oracle 存储过程,它返回一个包含 3 列的结果集。 一切都很好。

现在我有另一个只返回名字和姓氏而不是用户名的存储过程。

我收到以下错误:

无法从结果集用户名中读取列值

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

谢谢

【问题讨论】:

    标签: java hibernate jakarta-ee


    【解决方案1】:

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

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

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

    【讨论】:

    • 如果您正在使用一个简单的存储过程,它只执行一个简单的选择并返回表模式(就像使用 .NET 一样),我会完全放弃存储过程。让 hibernate 处理关联,并生成正确的 SQL。
    【解决方案2】:

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

    如果这样的话?

    【讨论】:

    • 据我所知,这是正确的。但是阅读 Hibernate 文档...问题就变成了,你真的需要依赖存储过程吗?您绝对不希望每个查询都有一个 POJO,它们或多或少都代表同一个对象。拥有您的 POJO,让他们在 HQL 中定义有用的查询,并让例如 SLSB 为客户端提供执行这些查询。干净简单。除非,你必须有存储的过程。
    猜你喜欢
    • 1970-01-01
    • 2011-02-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-10
    • 2011-02-11
    • 1970-01-01
    相关资源
    最近更新 更多