从JPA / Hibernate调用Sybase存储过程

时间:2012-09-19 07:54:27

标签: java hibernate jpa

我需要从JPA调用Sybase存储过程并将值返回到将用于填充另一个持久对象的Transient对象。

这就是我所做的:

@Entity
public class CBSCustomer {
String cpr;
<--snipped-->

@Id
@Transient
public String getCpr() {
    return cpr;
}

<---snipped-->

}

在bean中调用SP:

List<CBSCustomer> fetchedCustomerList = getEmPhoenix().createNativeQuery("{call sp_name(?)}", CBSCustomer.class).setParameter(1, cprInput).getResultList();

if (fetchedCustomerList.size() > 0) {              
          CBSCustomer cbsCustomer = ((CBSCustomer)fetchedCustomerList.get(0));
          setDisabled(true);
      }

不幸的是,我一直抱怨有关列名称的错误,即“x的列名无效”,其中x是CBSCustomer中我的字段的占位符。

1 个答案:

答案 0 :(得分:1)

经过大量的测试,这就是我做的方式。我希望它可以帮助别人。

1)您必须为结果集映射创建一个@Entity POJO,并使用@Transient注释所有字段。

2)你需要在该类中有一个@ResultSetMapping注释,例如

@SqlResultSetMapping(
name="CBSCustomer",
entities={
    @EntityResult(
        entityClass=CBSCustomer.class,
        fields={
            @FieldResult(name="name", column="Name"),
            @FieldResult(name="cpr", column="CPR"),
<--snipped-->
        }
    )
}

3)现在,您可以使用createNativeQuery中的“CBSCustomer”别名调用存储过程并将其映射到此字段,例如

createNativeQuery("{call procedure(?)}", "CBSCustomer")