【问题标题】:Hibernate stored procedure result problemHibernate存储过程结果问题
【发布时间】:2011-08-24 22:33:45
【问题描述】:

我正在尝试使用 Hibernate 调用存储过程,但我一直收到以下异常:

org.postgresql.util.PSQLException: The column name plan_id was not found in this ResultSet.

存储过程作为辅助数据库对象添加到一个 hbm.xml 中(实际上这是我唯一的 XML 映射文件,其他一切都通过注释完成):

<hibernate-mapping>
<database-object>
    <create>
CREATE OR REPLACE FUNCTION copy_plan(p_plan_id bigint, p_plan_for_year varchar, p_copy_pp boolean)
RETURNS REFCURSOR
AS $$
DECLARE
    result REFCURSOR;
    // some more declarations
BEGIN
    // a lot of logic which works fine

    OPEN result FOR 
    SELECT  plans.plan_id as plan_id,
            plans.plan_for_year as plan_for_year, 
            plans.plan_plan_id as plan_plan_id, 
            plans.plan_f_type as plan_f_type, 
            plans.plan_enabled as plan_enabled
    FROM rgt_plans plans WHERE plans.plan_id = v_plan_id;

    RETURN result;

END;
$$ LANGUAGE PLPGSQL
    </create>
    <drop>DROP FUNCTION copy_plan</drop>
</database-object>

实体类:

@Entity
@Table(name = "rgt_plans")
@NamedNativeQueries({ @NamedNativeQuery(name = "copyPlan", query = "select copy_plan(:planId, :newYear, :copy)", resultClass=Plan.class) })
public class Plan implements Serializable {

private static final long serialVersionUID = -8448579977833577641L;

@Id
@GeneratedValue(generator = "IdGenerator", strategy = GenerationType.TABLE)
@TableGenerator(name = "IdGenerator", pkColumnValue = "rgt_plans", table = "Sequence_Table", allocationSize = 1)
@Column(name = "plan_id", columnDefinition = "int4")
private Long id;

@Column(name = "plan_for_year")
@NotNull
private String forYear;

@Column(name = "plan_plan_id")
@Basic
private Long plan_id;

@Column(name = "plan_f_type", length = 1)
@Basic
@NotNull
private String type;

@Column(name = "plan_enabled")
@Basic
@NotNull
private Boolean enabled;

// getters, setters, equals, hashcode

}

这就是我在 DAO 中的称呼:

public List<Plan> copyPlan(Long currentPlanId, String newYear, Boolean copy) {
    return this.getHibernateTemplate()
            .findByNamedQueryAndNamedParam("copyPlan",
                    new String[] { "planId", "newYear", "copy" },
                    new Object[] { currentPlanId, newYear, copy });

}

如您所见,我使用的是 PostgreSQL 8。关于它为什么不起作用的任何想法?我的意思是,即使带有标签,我也会从该表中返回所有内容...

【问题讨论】:

    标签: hibernate stored-procedures


    【解决方案1】:

    好吧,经过多次谷歌搜索和诅咒,我让它运行起来了。

    我不得不将@NamedNativeQuery 更改为:

    @NamedNativeQueries({ @NamedNativeQuery(name = "copyPlan", query = "{? = call copy_plan(:planId, :newYear, :copy)}", resultClass = Plan.class, hints = { @QueryHint(value = "true", name = "org.hibernate.callable") }) })
    

    所以我添加了一个@QueryHint 并更改了查询本身。

    我还不得不在 DAO 层的方法处询问@Transactional。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-11-04
      • 1970-01-01
      • 2017-06-24
      • 1970-01-01
      • 1970-01-01
      • 2015-07-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多