JPA 映射错误
JPA mapping error
我正在尝试从 SQLite 数据库中检索一些数据。我将 JPA 与 EclipseLink 作为提供者一起使用,我正在尝试构建 REST API。我有我的模型 classes,我在其中进行查询的 class。 servcie 和其他 class 我在其中构建我的 URI。
这是我的模型class:
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 class:
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 class 调用方法的服务 class:
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();
}
}
这个 class 是我构建其余 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>
提前致谢!
查询应该是
Select v.name, v.model, v.purchasing_date from Vehicle v
您在问题中输入了 Vehicles
。实体名称为 Vehicle
(与 class 相同)。
我正在尝试从 SQLite 数据库中检索一些数据。我将 JPA 与 EclipseLink 作为提供者一起使用,我正在尝试构建 REST API。我有我的模型 classes,我在其中进行查询的 class。 servcie 和其他 class 我在其中构建我的 URI。
这是我的模型class:
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 class:
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 class 调用方法的服务 class:
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();
}
}
这个 class 是我构建其余 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>
提前致谢!
查询应该是
Select v.name, v.model, v.purchasing_date from Vehicle v
您在问题中输入了 Vehicles
。实体名称为 Vehicle
(与 class 相同)。