首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >返回List<Object[]> with JPA BeanPropertyRowMapper

返回List<Object[]> with JPA BeanPropertyRowMapper
EN

Stack Overflow用户
提问于 2021-12-09 18:11:36
回答 1查看 220关注 0票数 0

我正在使用Spring框架。我需要使用'n‘列数和多个where条件动态生成查询。我能够生成动态sql。现在我想执行这个查询并尝试foll。

代码语言:javascript
复制
List<Object[]> reportResults1 = namedJdbcTemplate.query(selectSql.toString(), new BeanPropertyRowMapper<>(Object[].class));

我知道这个错误:

代码语言:javascript
复制
java.lang.Exception: org.springframework.beans.BeanInstantiationException: Failed to instantiate [[Ljava.lang.Object;]: No default constructor found; nested exception is java.lang.NoSuchMethodException: [Ljava.lang.Object;.<init>()

我用过hibenrate处理过,而且效果很好。这是hibernate中的示例代码。

代码语言:javascript
复制
query = em.createNativeQuery(sqlQuery);
List<Object[]> reportResults = (List<Object[]>) query.getResultList();

我错过了春天的JPA。如何使它与BeanPropertyRowMapper和object[]的返回列表一起工作?任何帮助都是非常感谢的。谢谢。

EN

回答 1

Stack Overflow用户

发布于 2021-12-09 20:36:32

这不是JPA或Hibernate问题。查看BeanPropertyRowMapper的文档。

列值是基于匹配从结果集元数据获得的列名映射到相应属性的公共设置器的。这些名称可以直接匹配,也可以通过使用"camel“大小写将带有下划线的部分转换为相同的名称来匹配。

所发生的事情是,映射程序试图创建new Object[?]。问号表示缺少的尺寸。那是行不通的。即使它这样做了,Object[n]也没有为您将要得到的字段设置setters/getter。

也许您可以使用自己的RowMapper。您可以声明类似的类(就像一个例子,没有经过测试,可能需要调整):

代码语言:javascript
复制
public class ObjectArrayMapper implements RowMapper<Object[]> {
    @Override
    public Object[] mapRow(ResultSet rs, int rowNum) throws SQLException {
        var columnCount = rs.getMetaData().getColumnCount();
        var array = new Object[columnCount];
        for (int i = 0; i < columnCount; i++) {
            array[i] = rs.getObject(i);
        }
        return array;
    }
}

然后打电话:

代码语言:javascript
复制
List<Object[]> reportResults1 = 
    namedJdbcTemplate.query(selectSql.toString(),
        new ObjectArrayMapper());
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70294751

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档