【问题标题】:Return List<Object[]> with spring JPA BeanPropertyRowMapper使用 spring JPA BeanPropertyRowMapper 返回 List<Object[]>
【发布时间】:2022-01-14 13:40:38
【问题描述】:

我正在使用 Spring JPA 框架。我有一个要求,其中查询是使用“n”个列和多个 where 条件动态生成的。我能够生成动态sql。现在我想执行这个查询并尝试了以下操作。

List<Object[]> reportResults1 = namedJdbcTemplate.query(selectSql.toString(), new BeanPropertyRowMapper<>(Object[].class));

我得到这个错误:

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中的示例代码。

query = em.createNativeQuery(sqlQuery);
List<Object[]> reportResults = (List<Object[]>) query.getResultList();

Spring JPA 缺少什么。我如何让它与 BeanPropertyRowMapper 一起使用并返回对象 [] 列表?非常感谢任何帮助。谢谢。

【问题讨论】:

    标签: java spring hibernate jpa


    【解决方案1】:

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

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

    发生的情况是该映射器尝试创建new Object[?]。问号代表缺失维度。这是行不通的。即使有,Object[n] 也没有你将获得的字段的 setter/getter。

    也许您可以使用自己的RowMapper。您可以声明类(仅作为示例,未经测试,可能需要调整):

    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;
        }
    }
    

    然后调用:

    List<Object[]> reportResults1 = 
        namedJdbcTemplate.query(selectSql.toString(),
            new ObjectArrayMapper());
    

    【讨论】:

    • 感谢您的回复。你知道我还能做些什么来让它发挥作用吗?
    • @JNPW 检查更新
    猜你喜欢
    • 2016-06-13
    • 1970-01-01
    • 2016-05-04
    • 2022-07-11
    • 2015-09-09
    • 2016-11-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多