2011-08-24 21 views
1

我试图调用使用Hibernate存储过程,但我发现以下异常的所有时间: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.任何想法,为什么它不工作?我的意思是我从桌子上返回一切,即使有标签被攻击...

回答

2

经过大量的谷歌搜索和诅咒,我得到它运行。

我不得不把@NamedNativeQuery更改为:

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

所以我增加了一个@QueryHint,改变了查询本身。

我也不得不问@Transactional在DAO层的方法。