首页 > 解决方案 > net.sf.jasperreports.engine.JRException:从 bean 检索字段值时出错:全名。使用 NativeQuery 时

问题描述

得到:

net.sf.jasperreports.engine.JRException: Error retrieving field value from bean: fullname.

仅当与 一起使用NativeQuery时。HibernateJasperReports

当我使用 JPA 条件查询时,没有问题

JPA 标准

try (Session session = sessionFactory.openSession()) {
    CriteriaBuilder criteriaBuilder = session.getCriteriaBuilder();
    CriteriaQuery Client criteriaQuery = criteriaBuilder.createQuery(Client.class);
    Root root = criteriaQuery.from(Client.class);
    criteriaQuery.where(criteriaBuilder.equal(root.get("id"), id));
    return session.createQuery(criteriaQuery).getResultList();
}

但是当我使用 NativeQuery 我面临
net.sf.jasperreports.engine.JRException: Error retrieving field value from bean: fullname.

本机查询:

try (Session session = sessionFactory.openSession()) {
    List<Client> query = session.createNativeQuery("select c.*, p.*
        from client c join product p on c.pid = p.id where c.id = :id")
        .addEntity("c", Client.class).addJoin("p", "c.product")
        .setParameter("id", id).list();
    return query;
}

这里贾斯珀JRXML

<?xml version="1.0" encoding="UTF-8"?>
<jasperReport xmlns="http://jasperreports.sourceforge.net/jasperreports" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://jasperreports.sourceforge.net/jasperreports http://jasperreports.sourceforge.net/xsd/jasperreport.xsd" name="Quotation" pageWidth="595" pageHeight="600" whenNoDataType="AllSectionsNoDetail" columnWidth="555" leftMargin="20" rightMargin="20" topMargin="20" bottomMargin="20" uuid="3954e5eb-656a-454e-b9e5-35f7e5262d48">
    <property name="com.jaspersoft.studio.data.defaultdataadapter" value="One Empty Record"/>
    <property name="ireport.zoom" value="1.0"/>
    <property name="ireport.x" value="0"/>
    <property name="ireport.y" value="0"/>
    <field name="fullname" class="java.lang.String"/>
    <field name="mobile" class="java.lang.String"/>
    <field name="city" class="java.lang.String"/>
    <field name="address" class="java.lang.String"/>
    <field name="quotationNo" class="java.lang.String"/>
    <field name="valid" class="java.lang.String"/>
    <field name="product.description" class="java.lang.String"/>
    <field name="product.cost" class="java.lang.String"/>
    <field name="product.name" class="java.lang.String"/>

客户端.java:

public class Client  implements java.io.Serializable {

 private Integer id;
 private Product product;
 private String fullname;
 private String business;
 private String address;
 private String city;
 private String mobile;
 private String addedBy;
 private String date;
 private String status;
 private String quotationNo;
 private String valid;
 private String productName;
 private Set orderses = new HashSet(0);

public String getFullname() {
    return this.fullname;
}

public void setFullname(String fullname) {
    this.fullname = fullname;
}  

我已经从 Jasper JRXML 的字段中删除了

我还尝试如下传递和删除错误参数new JRBeanColllectionDataSource(collection, false);

new JRBeanColllectionDataSource(collection);  

传递"false" parameter只适用JPA criteriaNative query它是否传递参数无关紧要

net.sf.jasperreports.engine.JRException: Error retrieving field value from bean: fullname.   

我正在尝试NativeQuery提高JasperReport我之前的问题所建议的速度

所以解决方案我想要这个或我之前的问题
Jasper Reports 6.14 填充和生成报告是如此缓慢[关闭]

标签: javahibernatejasper-reports

解决方案


您的查询是select c.*, p.* from ...如此 Hibernate 返回一个 2 元素数组的列表:第一个元素是 the Client,第二个是Product.

即使它编译,查询的结果也不是List<Client>.

您需要将该数组列表转换为列表,Client然后再将其发送到 Jasperreports


推荐阅读