Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Jpa 在非实体类上选择使用@namedNativeRequesties连接_Jpa_Spring Boot - Fatal编程技术网

Jpa 在非实体类上选择使用@namedNativeRequesties连接

Jpa 在非实体类上选择使用@namedNativeRequesties连接,jpa,spring-boot,Jpa,Spring Boot,我想从复杂联接选择中检索数据,仅用于报告。我决定在没有@Entity注释的类中使用@NamedNativeQueries,如下所示 @NamedNativeQueries({ @NamedNativeQuery(name = "detailInformationForInvoicePurpose", query = "SELECT DISTINCT b.ShipName, \n" + " b.S

我想从复杂联接选择中检索数据,仅用于报告。我决定在没有@Entity注释的类中使用@NamedNativeQueries,如下所示

@NamedNativeQueries({
        @NamedNativeQuery(name = "detailInformationForInvoicePurpose",
                query = "SELECT DISTINCT b.ShipName, \n" +
                        "    b.ShipAddress, \n" +
                        "    b.ShipCity, \n" +
                        "    b.ShipRegion, \n" +
                        "    b.ShipPostalCode, \n" +
                        "    b.ShipCountry, \n" +
                        "    b.CustomerID, \n" +
                        "    c.CompanyName, \n" +
                        "    c.Address, \n" +
                        "    c.City, \n" +
                        "    c.Region, \n" +
                        "    c.PostalCode, \n" +
                        "    c.Country, \n" +
                        "    concat(d.FirstName,  ' ', d.LastName) AS Salesperson, \n" +
                        "    b.OrderID, \n" +
                        "    b.OrderDate, \n" +
                        "    b.RequiredDate, \n" +
                        "    b.ShippedDate, \n" +
                        "    a.CompanyName, \n" +
                        "    e.ProductID, \n" +
                        "    f.ProductName, \n" +
                        "    e.UnitPrice, \n" +
                        "    e.Quantity, \n" +
                        "    e.Discount,\n" +
                        "    e.UnitPrice * e.Quantity * (1 - e.Discount) AS ExtendedPrice,\n" +
                        "    b.Freight\n" +
                        "FROM Shippers a \n" +
                        "INNER JOIN Orders b ON a.ShipperID = b.ShipVia \n" +
                        "INNER JOIN Customers c ON c.CustomerID = b.CustomerID\n" +
                        "INNER JOIN Employees d ON d.EmployeeID = b.EmployeeID\n" +
                        "INNER JOIN Order_Details e ON b.OrderID = e.OrderID\n" +
                        "INNER JOIN Products f ON f.ProductID = e.ProductID\n" +
                        "ORDER BY b.ShipName",
                resultClass = JpaReport.class)
})
public class JpaReport {
    private String shipname;
    private String shipaddress;
    private String shipcity;
    private String shipregion;
    private String shippostalcode;
    private String shipcountry;
    private String customerid;
    private String companyname;
    private String address;
    private String city;
    private String region;
    private String postalcode;
    private String country;
    private String lastname;
    private String firstname;
    private Long orderid;
    private java.sql.Timestamp orderdate;
    private java.sql.Timestamp requireddate;
    private java.sql.Timestamp shippeddate;

    public JpaReport(String shipname, String shipaddress, String shipcity, String shipregion, String shippostalcode, String shipcountry, String customerid, String companyname, String address, String city, String region, String postalcode, String country, String lastname, String firstname, Long orderid, Timestamp orderdate, Timestamp requireddate, Timestamp shippeddate) {
        this.shipname = shipname;
        this.shipaddress = shipaddress;
        this.shipcity = shipcity;
        this.shipregion = shipregion;
        this.shippostalcode = shippostalcode;
        this.shipcountry = shipcountry;
        this.customerid = customerid;
        this.companyname = companyname;
        this.address = address;
        this.city = city;
        this.region = region;
        this.postalcode = postalcode;
        this.country = country;
        this.lastname = lastname;
        this.firstname = firstname;
        this.orderid = orderid;
        this.orderdate = orderdate;
        this.requireddate = requireddate;
        this.shippeddate = shippeddate;
    }
 public List<JpaReport> detailInformationForInvoicePurpose(){
        List<JpaReport> jpaReport = em.createNativeQuery("SELECT DISTINCT b.ShipName, \n" +
                "    b.ShipAddress, \n" +
                        "    b.ShipCity, \n" +
                        "    b.ShipRegion, \n" +
                        "    b.ShipPostalCode, \n" +
                        "    b.ShipCountry, \n" +
                        "    b.CustomerID, \n" +
                        "    c.CompanyName as customersCompasnyName, \n" +
                        "    c.Address, \n" +
                        "    c.City, \n" +
                        "    c.Region, \n" +
                        "    c.PostalCode, \n" +
                        "    c.Country, \n" +
                        "    concat(d.FirstName,  ' ', d.LastName) AS Salesperson, \n" +
                        "    b.OrderID, \n" +
                        "    b.OrderDate, \n" +
                        "    b.RequiredDate, \n" +
                        "    b.ShippedDate, \n" +
                        "    a.CompanyName as shipersCompanyName, \n" +
                        "    e.ProductID, \n" +
                        "    f.ProductName, \n" +
                        "    e.UnitPrice, \n" +
                        "    e.Quantity, \n" +
                        "    e.Discount,\n" +
                        "    e.UnitPrice * e.Quantity * (1 - e.Discount) AS ExtendedPrice,\n" +
                        "    b.Freight\n" +
                        "FROM Shippers a \n" +
                        "INNER JOIN Orders b ON a.ShipperID = b.ShipVia \n" +
                        "INNER JOIN Customers c ON c.CustomerID = b.CustomerID\n" +
                        "INNER JOIN Employees d ON d.EmployeeID = b.EmployeeID\n" +
                        "INNER JOIN Order_Details e ON b.OrderID = e.OrderID\n" +
                        "INNER JOIN Products f ON f.ProductID = e.ProductID\n" +
                        "ORDER BY b.ShipName").getResultList();
        return jpaReport;
    }
当我试图从JpaReport类中检索数据列表时,我有一些信息,请看屏幕截图

@Repository
public class JpaReportDaoImpl {

    @PersistenceContext
    private EntityManager em;

    public List<JpaReport> detailInformationForInvoicePurpose(){
        List<JpaReport> jpaReport = em.createNamedQuery("detailInformationForInvoicePurpose", JpaReport.class).getResultList();
        return jpaReport;
    }

}
@存储库
公共类JpaReportDaoImpl{
@持久上下文
私人实体管理者;
公共列表详细信息用于发票目的(){
List jpaReport=em.createNamedQuery(“detailInformationForInvoicePurpose”,jpaReport.class).getResultList();
返回jpaReport;
}
}

我有一个问题:

  • 我做错了什么
  • 这是一种只为用户检索数据的好方法 报告
我还尝试提取如下数据

@NamedNativeQueries({
        @NamedNativeQuery(name = "detailInformationForInvoicePurpose",
                query = "SELECT DISTINCT b.ShipName, \n" +
                        "    b.ShipAddress, \n" +
                        "    b.ShipCity, \n" +
                        "    b.ShipRegion, \n" +
                        "    b.ShipPostalCode, \n" +
                        "    b.ShipCountry, \n" +
                        "    b.CustomerID, \n" +
                        "    c.CompanyName, \n" +
                        "    c.Address, \n" +
                        "    c.City, \n" +
                        "    c.Region, \n" +
                        "    c.PostalCode, \n" +
                        "    c.Country, \n" +
                        "    concat(d.FirstName,  ' ', d.LastName) AS Salesperson, \n" +
                        "    b.OrderID, \n" +
                        "    b.OrderDate, \n" +
                        "    b.RequiredDate, \n" +
                        "    b.ShippedDate, \n" +
                        "    a.CompanyName, \n" +
                        "    e.ProductID, \n" +
                        "    f.ProductName, \n" +
                        "    e.UnitPrice, \n" +
                        "    e.Quantity, \n" +
                        "    e.Discount,\n" +
                        "    e.UnitPrice * e.Quantity * (1 - e.Discount) AS ExtendedPrice,\n" +
                        "    b.Freight\n" +
                        "FROM Shippers a \n" +
                        "INNER JOIN Orders b ON a.ShipperID = b.ShipVia \n" +
                        "INNER JOIN Customers c ON c.CustomerID = b.CustomerID\n" +
                        "INNER JOIN Employees d ON d.EmployeeID = b.EmployeeID\n" +
                        "INNER JOIN Order_Details e ON b.OrderID = e.OrderID\n" +
                        "INNER JOIN Products f ON f.ProductID = e.ProductID\n" +
                        "ORDER BY b.ShipName",
                resultClass = JpaReport.class)
})
public class JpaReport {
    private String shipname;
    private String shipaddress;
    private String shipcity;
    private String shipregion;
    private String shippostalcode;
    private String shipcountry;
    private String customerid;
    private String companyname;
    private String address;
    private String city;
    private String region;
    private String postalcode;
    private String country;
    private String lastname;
    private String firstname;
    private Long orderid;
    private java.sql.Timestamp orderdate;
    private java.sql.Timestamp requireddate;
    private java.sql.Timestamp shippeddate;

    public JpaReport(String shipname, String shipaddress, String shipcity, String shipregion, String shippostalcode, String shipcountry, String customerid, String companyname, String address, String city, String region, String postalcode, String country, String lastname, String firstname, Long orderid, Timestamp orderdate, Timestamp requireddate, Timestamp shippeddate) {
        this.shipname = shipname;
        this.shipaddress = shipaddress;
        this.shipcity = shipcity;
        this.shipregion = shipregion;
        this.shippostalcode = shippostalcode;
        this.shipcountry = shipcountry;
        this.customerid = customerid;
        this.companyname = companyname;
        this.address = address;
        this.city = city;
        this.region = region;
        this.postalcode = postalcode;
        this.country = country;
        this.lastname = lastname;
        this.firstname = firstname;
        this.orderid = orderid;
        this.orderdate = orderdate;
        this.requireddate = requireddate;
        this.shippeddate = shippeddate;
    }
 public List<JpaReport> detailInformationForInvoicePurpose(){
        List<JpaReport> jpaReport = em.createNativeQuery("SELECT DISTINCT b.ShipName, \n" +
                "    b.ShipAddress, \n" +
                        "    b.ShipCity, \n" +
                        "    b.ShipRegion, \n" +
                        "    b.ShipPostalCode, \n" +
                        "    b.ShipCountry, \n" +
                        "    b.CustomerID, \n" +
                        "    c.CompanyName as customersCompasnyName, \n" +
                        "    c.Address, \n" +
                        "    c.City, \n" +
                        "    c.Region, \n" +
                        "    c.PostalCode, \n" +
                        "    c.Country, \n" +
                        "    concat(d.FirstName,  ' ', d.LastName) AS Salesperson, \n" +
                        "    b.OrderID, \n" +
                        "    b.OrderDate, \n" +
                        "    b.RequiredDate, \n" +
                        "    b.ShippedDate, \n" +
                        "    a.CompanyName as shipersCompanyName, \n" +
                        "    e.ProductID, \n" +
                        "    f.ProductName, \n" +
                        "    e.UnitPrice, \n" +
                        "    e.Quantity, \n" +
                        "    e.Discount,\n" +
                        "    e.UnitPrice * e.Quantity * (1 - e.Discount) AS ExtendedPrice,\n" +
                        "    b.Freight\n" +
                        "FROM Shippers a \n" +
                        "INNER JOIN Orders b ON a.ShipperID = b.ShipVia \n" +
                        "INNER JOIN Customers c ON c.CustomerID = b.CustomerID\n" +
                        "INNER JOIN Employees d ON d.EmployeeID = b.EmployeeID\n" +
                        "INNER JOIN Order_Details e ON b.OrderID = e.OrderID\n" +
                        "INNER JOIN Products f ON f.ProductID = e.ProductID\n" +
                        "ORDER BY b.ShipName").getResultList();
        return jpaReport;
    }
invoicepurpose()的公共列表详细信息{
列出jpaReport=em.createNativeQuery(“选择不同的b.ShipName,\n”+
b.发货地址,\n+
b.ShipCity\n+
b.ShipRegion\n+
b.ShipPostalCode\n+
b.ShipCountry\n+
b.客户ID,\n+
c.公司名称作为客户公司名称\n+
c.地址,\n+
“c.城市,\n”+
c.区域,\n+
“c.PostalCode,\n”+
c.国家,\n+
concat(d.FirstName,,,d.LastName)作为销售人员,\n+
b.OrderID\n+
b.OrderDate\n+
b.RequiredDate\n+
b.发货日期,\n+
a.CompanyName作为发货人CompanyName,\n+
e.ProductID\n+
f.ProductName\n+
“e.单价,\n”+
e.数量,\n+
e.折扣,\n+
“e.单价*e.数量*(1-e.折扣)作为扩展价格,\n”+
“b.运费\n”+
“来自托运人a\n”+
“a.ShipperID=b.ShipVia上的内部联接订单b\n”+
“在c.CustomerID=b.CustomerID上内部加入客户c\n”+
“在d.EmployeeID=b.EmployeeID上内部加入员工d\n”+
“内部联接顺序\u详细信息b.OrderID=e.OrderID上的e\n”+
“f.ProductID=e.ProductID上的内部联接产品f\n”+
“按b.ShipName订购”).getResultList();
返回jpaReport;
}
但是当我想按下面的
List
进行迭代时,我会得到一个错误

List<JpaReport> jpaReports = jpaReportDaoImpl.detailInformationForInvoicePurpose();
        for (JpaReport jpaReport : jpaReports) {
            System.out.println(jpaReport);
        }
List jpaReports=jpaReportDaoImpl.detailInformationForInvoicePurpose();
用于(JpaReport JpaReport:jpaReports){
System.out.println(jpaReport);
}

原因:java.lang.ClassCastException:[Ljava.lang.Object;不能强制转换为######################模型.JpaReport

由于它不是托管实体类,查询注释根本不会被处理。移动到托管实体()类。

我移动了@namednaviquery do Shippers@Entity类,但结果是相同的`@Entity@namednaviqueries({@namednaviquery(name=“detailInformationForInvoicePurpose”,query=“query string like up”,resultClass=JpaReport.class)})公共类托运人{@Id@GeneratedValue private Long shipperid;private String companyname;private String phone;@OneToMany(mappedBy=“orderid”)private List orders;@jocom您是否能够管理此问题。我有wprk处理完全相同的问题。我有db view管理到实体,并在其上使用JPA QL。但更多数据正在破坏此功能,需要在view query中移动where子句,我现在唯一可以管理的方法是使用本机查询。可以使用使用语句EXTECUQUERY se的旧方法tParameter等,但我更喜欢使用JPA。JPA规范只允许您在实体类上定义命名查询。一些JPA提供程序(例如DataNucleus JPA)允许您对任何对象执行此操作,但这是特定于供应商的。根据JPA规范,将其放在实体类上。请查看上面的我更新了我的问题,这是什么?您执行了一个包含多个结果的查询,并且惊讶于每一行都是object[]。这就是jpa规范告诉您的!阅读它如果您想要自定义结果类型,对于本机查询,请查看以下内容: