java如何使用hibernate存储过程查询和结果集转换器
这就是我调用sql server存储过程的方式
public Response<List<CollectionItem>> getCollectionList(int customerId) {
StoredProcedureQuery query = entityManager.createStoredProcedureQuery("Sp_Tab_GetCollectionInvoice");
query.registerStoredProcedureParameter("CustomeriD", int.class, ParameterMode.IN);
query.registerStoredProcedureParameter("Ccode", int.class, ParameterMode.IN);
query.setParameter("CustomeriD", customerId);
query.setParameter("Ccode", 1);
List<CollectionItem> resultList = query.unwrap(Query.class)
.setResultTransformer(Transformers.aliasToBean(CollectionItem.class)).getResultList();
return new ResponseUtil().createResponse(resultList);
}
这是pojo课程
public class CollectionItem {
public long ID;
public String TransType;
public long Invno;
public String TDate;
public double Amount;
public CollectionItem(long ID, String TransType, long Invno, String TDate, double Amount) {
this.ID = ID;
this.TransType = TransType;
this.Invno = Invno;
this.TDate = TDate;
this.Amount = Amount;
}
}
但它并没有转换结果,而是给出了一个对象数组列表
如何将对象数组正确映射到pojo类
我应该通过运行循环手动将对象数组转换为pojo吗
# 1 楼答案
我不是这个问题的专家,但是,
EntityManager.createStoredProdecureQuery
有第二个参数用于指定返回类型。当您像下面这样更改调用时会发生什么(也请对您设置的ResultTransformer行进行注释)?:如果上述解决方案不起作用,我怀疑存储过程返回的列与所需的POJO类成员不匹配。可以使用
<sql-result-set-mapping>
或相应的注释编写映射,将结果集映射到类成员。据我记忆所及,Hibernate的查询接口也有以编程方式处理这种映射的方法。您可能需要检查addRoot()
和addProperty()
方法注意:我刚刚注意到你的
CollectionItem
类没有用@Entity
注释。我不确定上述解决方案在这种情况下是否有效。如果不想添加@Entity
并使用结果转换器,我认为CollectionItem
类需要一个没有参数的构造函数。为了让bean transformer工作,Hibernate要求该类要么没有构造函数,要么没有公共的无参数构造函数