【问题标题】:JPA mapping errorJPA 映射错误
【发布时间】:2017-08-08 15:21:39
【问题描述】:

我正在尝试从 SQLite 数据库中检索一些数据。我正在使用 JPA 和 EclipseLink 作为提供程序,并且我正在尝试构建一个 REST API。我有我的模型类,我在其中进行查询。我在其中构造 URI 的 servcie 和 rest 类。

这是我的模型类:

package com.vehicle.model;

import java.io.Serializable;
import javax.persistence.*;
import java.math.BigDecimal;


/**
 * The persistent class for the "Vehicles" database table.
 * 
 */
@Entity
@Table(name="\"Vehicles\"")
@NamedQuery(name="Vehicle.findAll", query="SELECT v FROM Vehicle v")
public class Vehicle implements Serializable {
    private static final long serialVersionUID = 1L;

    @Id
    @Column(name="\"Model\"")
    private String model;

    @Column(name="\"Name\"")
    private String name;

    @Column(name="\"Purchasing_date\"")
    private BigDecimal purchasing_date;

    public Vehicle() {
    }

    public String getModel() {
        return this.model;
    }

    public void setModel(String model) {
        this.model = model;
    }

    public String getName() {
        return this.name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public BigDecimal getPurchasing_date() {
        return this.purchasing_date;
    }

    public void setPurchasing_date(BigDecimal purchasing_date) {
        this.purchasing_date = purchasing_date;
    }

}

这是我的 DAO 类:

package com.vehicle.dao;



import java.util.ArrayList;
import java.util.List;

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;
import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Root;

import com.vehicle.model.Vehicle;


public class VehicleDAO {

    EntityManagerFactory emfactory = Persistence.createEntityManagerFactory( "example" );

    EntityManager em = emfactory.createEntityManager( );


       public void fetchVehicle(){
           Query query = em.createQuery("Select v.name, v.model, v.purchasing_date from Vehicles v");
                      List<String> list = query.getResultList();

                      for(String e:list) {
                         System.out.println("Vehicle NAME :"+e);
                      }

       }


}

这是从我的 DAO 类调用方法的服务类:

package com.vehicle.service;


import java.util.ArrayList;

import com.vehicle.dao.VehicleDAO;
import com.vehicle.model.Vehicle;


public class VehicleService {

    VehicleDAO vehicleDao = new VehicleDAO();

    public void getDefaultVehicle() {
        System.out.println("BLAAAAAA");
       vehicleDao.fetchVehicle();
    }
}

这个类是我在其中构造我的其余 URI 的类:

package com.vehicle.rest;



import java.util.ArrayList;

import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;

import com.vehicle.model.Vehicle;
import com.vehicle.service.VehicleService;


@Path("/vehicles")
public class VehicleRest {

VehicleService vehicleService = new VehicleService();

    @GET
    @Path("/getVehicles")
    @Produces(MediaType.APPLICATION_JSON)
    public void getDefaultVehicleInJSON() {
        System.out.println("BLAAAAAAA");
        vehicleService.getDefaultVehicle();
    }
}

问题是,当我尝试在浏览器中运行它时,它给了我这个错误:

Aug 08, 2017 6:08:27 PM com.sun.jersey.spi.container.ContainerResponse mapMappableContainerException
SEVERE: The RuntimeException could not be mapped to a response, re-throwing to the HTTP container
java.lang.IllegalArgumentException: An exception occurred while creating a query in EntityManager: 
Exception Description: Problem compiling [Select v.name, v.model, v.purchasing_date from Vehicles v]. 
[7, 13] The state field path 'v.name' cannot be resolved to a valid type.
[15, 22] The state field path 'v.model' cannot be resolved to a valid type.
[24, 41] The state field path 'v.purchasing_date' cannot be resolved to a valid type.
[47, 55] The abstract schema type 'Vehicles' is unknown.

我不明白为什么。没有架构,它只是默认架构。

编辑:

这是我的 persistence.xml:

<?xml version="1.0" encoding="UTF-8" ?>
  <persistence xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"
      version="2.0"
      xmlns="http://java.sun.com/xml/ns/persistence">
    <persistence-unit name="example" transaction-type="RESOURCE_LOCAL">
      <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
      <class>com.vehicle.model.Vehicle</class>
       <exclude-unlisted-classes>true</exclude-unlisted-classes>
      <properties>
        <property name="javax.persistence.jdbc.driver" value="org.sqlite.JDBC" />
        <property name="javax.persistence.jdbc.url" value="jdbc:sqlite:C:/development.sqlite3" />
        <property name="eclipselink.logging.level" value="ALL" />
        <property name="eclipselink.ddl-generation" value="create-tables" />
      </properties>
    </persistence-unit>
 </persistence>

提前致谢!

【问题讨论】:

  • 因为它是一个抛出异常的 JPQL 查询(大概......你没有发布异常及其堆栈跟踪),所以帖子的 REST 部分是无关紧要的。 Vehicle 是已知的实体类型(在 persistence.xml 中指定,还是 exclude-unlisted-classes 设置为 false?)
  • 我编辑了我的问题。
  • 为什么要转义表名和列名?尝试在不转义的情况下编写它们,例如。 @Table(name="Vehicles")
  • 我用 JPA 工具生成了模型类,结果就是这样。
  • 我删除了转义,但它什么也没做。

标签: java rest jpa eclipselink dao


【解决方案1】:

查询应该是

Select v.name, v.model, v.purchasing_date from Vehicle v

您在问题中输入了Vehicles。实体名称为Vehicle(与类相同)。

【讨论】:

  • 我修改了我的查询,但现在我收到此错误:异常 [EclipseLink-4002] (Eclipse Persistence Services - 2.5.1.v20130918-f2b9fc5): org.eclipse.persistence.exceptions.DatabaseException 内部异常: org.sqlite.SQLiteException: [SQLITE_ERROR] SQL 错误或缺少数据库(没有这样的表:Vehicles) 错误代码:1 调用:SELECT "Name", "Model", "Purchasing_date" FROM "Vehicles" 查询:ReportQuery(referenceClass= Vehicle sql="SELECT "Name", "Model", "Purchasing_date" FROM "Vehicles")
  • 好像找不到表。
  • 我可以检查是否建立了与数据库的连接吗?
  • 您需要在运行查询之前创建表,并且 JPA 提供了执行此操作的属性 datanucleus.org/products/accessplatform_5_1/jpa/… 根据任何基本的 JPA 参考文档所述
  • 谁知道什么是“jpa 工具”。 JPA 规范没有提供这样的东西。此答案修复了您的查询错误。架构错误是另外一种方式
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-01-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-04
  • 2011-07-13
  • 2020-04-15
相关资源
最近更新 更多