有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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) 个答案

  1. # 1 楼答案

    我不是这个问题的专家,但是,EntityManager.createStoredProdecureQuery有第二个参数用于指定返回类型。当您像下面这样更改调用时会发生什么(也请对您设置的ResultTransformer行进行注释)?:

    StoredProcedureQuery query = entityManager.createStoredProcedureQuery("Sp_Tab_GetCollectionInvoice", CollectionItem.class);
    

    如果上述解决方案不起作用,我怀疑存储过程返回的列与所需的POJO类成员不匹配。可以使用<sql-result-set-mapping>或相应的注释编写映射,将结果集映射到类成员。据我记忆所及,Hibernate的查询接口也有以编程方式处理这种映射的方法。您可能需要检查addRoot()addProperty()方法

    注意:我刚刚注意到你的CollectionItem类没有用@Entity注释。我不确定上述解决方案在这种情况下是否有效。如果不想添加@Entity并使用结果转换器,我认为CollectionItem类需要一个没有参数的构造函数。为了让bean transformer工作,Hibernate要求该类要么没有构造函数,要么没有公共的无参数构造函数