Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/http/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用和SQL查询的基本Hibernate问题_Java_Hibernate_Jakarta Ee - Fatal编程技术网

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

Java 使用和SQL查询的基本Hibernate问题,java,hibernate,jakarta-ee,Java,Hibernate,Jakarta Ee,我有一个java对象Person,它有3个属性firstname、lastname和username 我有一个Oracle存储过程返回一个包含3列的结果集。 这一切都很好 现在我有了另一个只返回firstname和lastname而不返回username的存储过程 我得到以下错误: 无法从结果集用户名读取列值 Hibernate尝试从resultset获取username属性。 如果我删除了属性用户名,那么它就可以工作了 我的配置: <sql-query name="normalise"

我有一个java对象
Person
,它有3个属性
firstname
lastname
username

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

现在我有了另一个只返回firstname和lastname而不返回username的存储过程

我得到以下错误:

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

Hibernate尝试从resultset获取username属性。 如果我删除了属性用户名,那么它就可以工作了

我的配置:

<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>
电话:

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吗


谢谢你

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

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


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

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


如果这是正确的?

如果您使用的是一个简单的存储过程,它只执行简单的选择并返回表模式(就像您使用.NET一样),那么我将完全不使用存储过程。让hibernate处理关联,并生成正确的SQL。据我所知,这是正确的。但是请阅读Hibernate文档。。。问题是,您真的需要依赖存储过程吗?您肯定不希望每个查询都有一个POJO,或多或少都表示同一个对象。让您的POJO在HQL中定义有用的查询,并让SLSB为客户机提供执行这些查询的服务。干净简单。除非,否则您必须拥有存储的进程。
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());
    }
}