休眠 org.hibernate.QueryException: 不是实体
Hibernate org.hibernate.QueryException: not an entity
我在 Spring 中执行此操作,是 JPQL 的新手。我在查询中到底做错了什么(在 CustomerOrder class 中)?尝试通过几种方式来做到这一点,但我总是在那里得到那个例外。当我尝试@NamedNativeQuery 并通过 REST 端点进行查询时,出现语法异常。
第二个问题是我正在使用 spring.jpa.hibernate.ddl-auto,是否可以这样并且应该手动创建表?
这是第一个class。这是@OneToMany关系
@Entity
@Table(name = "customer")
public class Customer implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "customer_id")
private Long customerId;
@Column(name = "first_name")
private String firstName;
@Column(name = "last_name")
private String lastName;
@Column(name = "telephone")
private Long telephone;
@Column(name = "email")
private String email;
@Embedded
private Address address;
@OneToMany(mappedBy = "customer")
@JsonManagedReference
private List<CustomerOrder> orderList = new ArrayList<>();
public Customer() {
}
public Customer(String firstName, String lastName, Long telephone, String email, Address address) {
this.firstName = firstName;
this.lastName = lastName;
this.telephone = telephone;
this.email = email;
this.address = new Address(address);
}
这是关系的第二部分
@Entity
@Table(name = "customer_order")
@NamedQuery(query =
"SELECT c.customerId, " +
"c.firstName, " +
"c.lastName," +
" c.telephone, " +
"c.email, " +
"c.address.country," +
" c.address.houseNumber, " +
"c.address.apartmentNumber, " +
"c.address.postalCode," +
" c.address.postalCode, " +
"o.orderId, " +
"o.totalPrice, " +
" o.totalQuantity, " +
"o.cartItems " +
"FROM CustomerOrder o JOIN o.customer c", name = "Order.query")
public class CustomerOrder implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "order_id")
private Long orderId;
@ElementCollection
@CollectionTable(name = "cart_items", joinColumns = @JoinColumn(name = "order_id"))
private List<CartItem> cartItems;
@Column(name = "total_price")
private BigDecimal totalPrice;
@Column(name = "total_quantity")
private Integer totalQuantity;
@ManyToOne(cascade = CascadeType.ALL)
@JsonBackReference
@JoinColumn(name = "customer_id")
private Customer customer;
public CustomerOrder() {
}
public CustomerOrder(List<CartItem> items , CustomerOrderRequest request) {
this.cartItems = new LinkedList<>(items);
this.totalPrice = request.getTotalPrice();
this.totalQuantity = request.getTotalQuantity();
}
存储库:
import java.util.List;
@Repository
public interface CustomerOrderRepository extends CrudRepository<CustomerOrder, Long> {
@Query(name = "Order.query")
List<FullOrder> findALlOrders();
}
这是class所有数据应该映射到的。
public class FullOrder {
private Long customerId;
private String firstName;
private String lastName;
private Long telephone;
private String email;
private String country;
private Integer houseNumber;
private Integer apartmentNumber;
private String postalCode;
private String city;
private Long orderId;
private BigDecimal totalPrice;
private Integer totalQuantity;
private List<CartItem> cartItems;
const. getters setters etc.
异常:
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'roleRepository' defined in luke.shopbackend.repository.RoleRepository defined in @EnableJpaRepositories declared on JpaRepositoriesRegistrar.EnableJpaRepositoriesConfiguration: Cannot resolve reference to bean 'jpaMappingContext' while setting bean property 'mappingContext'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'jpaMappingContext': Invocation of init method failed; nested exception is javax.persistence.PersistenceException: [PersistenceUnit: default] Unable to build Hibernate SessionFactory; nested exception is org.hibernate.HibernateException: Errors in named queries:
Order.query failed because of: org.hibernate.QueryException: not an entity [SELECT c.customerId, c.firstName, c.lastName, c.telephone, c.email, c.address.country, c.address.houseNumber, c.address.apartmentNumber, c.address.postalCode, c.address.postalCode, o.orderId, o.totalPrice, o.totalQuantity, o.cartItems FROM luke.shopbackend.model.entity.CustomerOrder o JOIN o.customer c]
at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveReference(BeanDefinitionValueResolver.java:342) ~[spring-beans-5.2.7.RELEASE.jar:5.2.7.RELEASE]
at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveValueIfNecessary(BeanDefinitionValueResolver.java:113) ~[spring-beans-5.2.7.RELEASE.jar:5.2.7.RELEASE]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyPropertyValues(AbstractAutowireCapableBeanFactory.java:1699) ~[spring-beans-5.2.7.RELEASE.jar:5.2.7.RELEASE]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1444) ~[spring-beans-5.2.7.RELEASE.jar:5.2.7.RELEASE]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:594) ~[spring-beans-5.2.7.RELEASE.jar:5.2.7.RELEASE]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:517) ~[spring-beans-5.2.7.RELEASE.jar:5.2.7.RELEASE]
at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean[=15=](AbstractBeanFactory.java:323) ~[spring-beans-5.2.7.RELEASE.jar:5.2.7.RELEASE]
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:226) ~[spring-beans-5.2.7.RELEASE.jar:5.2.7.RELEASE]
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:321) ~[spring-beans-5.2.7.RELEASE.jar:5.2.7.RELEASE]
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:202) ~[spring-beans-5.2.7.RELEASE.jar:5.2.7.RELEASE]
at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBeansOfType(DefaultListableBeanFactory.java:621) ~[spring-beans-5.2.7.RELEASE.jar:5.2.7.RELEASE]
at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBeansOfType(DefaultListableBeanFactory.java:609) ~[spring-beans-5.2.7.RELEASE.jar:5.2.7.RELEASE]
at org.springframework.data.repository.config.DeferredRepositoryInitializationListener.onApplicationEvent(DeferredRepositoryInitializationListener.java:51) ~[spring-data-commons-2.3.1.RELEASE.jar:2.3.1.RELEASE]
at org.springframework.data.repository.config.DeferredRepositoryInitializationListener.onApplicationEvent(DeferredRepositoryInitializationListener.java:36) ~[spring-data-commons-2.3.1.RELEASE.jar:2.3.1.RELEASE]
at org.springframework.context.event.SimpleApplicationEventMulticaster.doInvokeListener(SimpleApplicationEventMulticaster.java:172) ~[spring-context-5.2.7.RELEASE.jar:5.2.7.RELEASE]
at org.springframework.context.event.SimpleApplicationEventMulticaster.invokeListener(SimpleApplicationEventMulticaster.java:165) ~[spring-context-5.2.7.RELEASE.jar:5.2.7.RELEASE]
at org.springframework.context.event.SimpleApplicationEventMulticaster.multicastEvent(SimpleApplicationEventMulticaster.java:139) ~[spring-context-5.2.7.RELEASE.jar:5.2.7.RELEASE]
at org.springframework.context.support.AbstractApplicationContext.publishEvent(AbstractApplicationContext.java:404) ~[spring-context-5.2.7.RELEASE.jar:5.2.7.RELEASE]
at org.springframework.context.support.AbstractApplicationContext.publishEvent(AbstractApplicationContext.java:361) ~[spring-context-5.2.7.RELEASE.jar:5.2.7.RELEASE]
at org.springframework.context.support.AbstractApplicationContext.finishRefresh(AbstractApplicationContext.java:898) ~[spring-context-5.2.7.RELEASE.jar:5.2.7.RELEASE]
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:554) ~[spring-context-5.2.7.RELEASE.jar:5.2.7.RELEASE]
at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:143) ~[spring-boot-2.3.1.RELEASE.jar:2.3.1.RELEASE]
at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:758) ~[spring-boot-2.3.1.RELEASE.jar:2.3.1.RELEASE]
at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:750) ~[spring-boot-2.3.1.RELEASE.jar:2.3.1.RELEASE]
at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:397) ~[spring-boot-2.3.1.RELEASE.jar:2.3.1.RELEASE]
at org.springframework.boot.SpringApplication.run(SpringApplication.java:315) ~[spring-boot-2.3.1.RELEASE.jar:2.3.1.RELEASE]
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1237) ~[spring-boot-2.3.1.RELEASE.jar:2.3.1.RELEASE]
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1226) ~[spring-boot-2.3.1.RELEASE.jar:2.3.1.RELEASE]
at luke.shopbackend.ShopBackendApplication.main(ShopBackendApplication.java:11) ~[classes/:na]
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na]
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:na]
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na]
at java.base/java.lang.reflect.Method.invoke(Method.java:564) ~[na:na]
at org.springframework.boot.devtools.restart.RestartLauncher.run(RestartLauncher.java:49) ~[spring-boot-devtools-2.3.1.RELEASE.jar:2.3.1.RELEASE]
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'jpaMappingContext': Invocation of init method failed; nested exception is javax.persistence.PersistenceException: [PersistenceUnit: default] Unable to build Hibernate SessionFactory; nested exception is org.hibernate.HibernateException: Errors in named queries:
Order.query failed because of: org.hibernate.QueryException: not an entity [SELECT c.customerId, c.firstName, c.lastName, c.telephone, c.email, c.address.country, c.address.houseNumber, c.address.apartmentNumber, c.address.postalCode, c.address.postalCode, o.orderId, o.totalPrice, o.totalQuantity, o.cartItems FROM luke.shopbackend.model.entity.CustomerOrder o JOIN o.customer c]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1796) ~[spring-beans-5.2.7.RELEASE.jar:5.2.7.RELEASE]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:595) ~[spring-beans-5.2.7.RELEASE.jar:5.2.7.RELEASE]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:517) ~[spring-beans-5.2.7.RELEASE.jar:5.2.7.RELEASE]
at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean[=15=](AbstractBeanFactory.java:323) ~[spring-beans-5.2.7.RELEASE.jar:5.2.7.RELEASE]
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:226) ~[spring-beans-5.2.7.RELEASE.jar:5.2.7.RELEASE]
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:321) ~[spring-beans-5.2.7.RELEASE.jar:5.2.7.RELEASE]
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:202) ~[spring-beans-5.2.7.RELEASE.jar:5.2.7.RELEASE]
at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveReference(BeanDefinitionValueResolver.java:330) ~[spring-beans-5.2.7.RELEASE.jar:5.2.7.RELEASE]
... 33 common frames omitted
Caused by: javax.persistence.PersistenceException: [PersistenceUnit: default] Unable to build Hibernate SessionFactory; nested exception is org.hibernate.HibernateException: Errors in named queries:
Order.query failed because of: org.hibernate.QueryException: not an entity [SELECT c.customerId, c.firstName, c.lastName, c.telephone, c.email, c.address.country, c.address.houseNumber, c.address.apartmentNumber, c.address.postalCode, c.address.postalCode, o.orderId, o.totalPrice, o.totalQuantity, o.cartItems FROM luke.shopbackend.model.entity.CustomerOrder o JOIN o.customer c]
at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.buildNativeEntityManagerFactory(AbstractEntityManagerFactoryBean.java:403) ~[spring-orm-5.2.7.RELEASE.jar:5.2.7.RELEASE]
at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264) ~[na:na]
at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1130) ~[na:na]
at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:630) ~[na:na]
at java.base/java.lang.Thread.run(Thread.java:832) ~[na:na]
Caused by: org.hibernate.HibernateException: Errors in named queries:
Order.query failed because of: org.hibernate.QueryException: not an entity [SELECT c.customerId, c.firstName, c.lastName, c.telephone, c.email, c.address.country, c.address.houseNumber, c.address.apartmentNumber, c.address.postalCode, c.address.postalCode, o.orderId, o.totalPrice, o.totalQuantity, o.cartItems FROM luke.shopbackend.model.entity.CustomerOrder o JOIN o.customer c]
at org.hibernate.internal.SessionFactoryImpl.<init>(SessionFactoryImpl.java:341) ~[hibernate-core-5.4.17.Final.jar:5.4.17.Final]
at org.hibernate.boot.internal.SessionFactoryBuilderImpl.build(SessionFactoryBuilderImpl.java:469) ~[hibernate-core-5.4.17.Final.jar:5.4.17.Final]
at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:1259) ~[hibernate-core-5.4.17.Final.jar:5.4.17.Final]
at org.springframework.orm.jpa.vendor.SpringHibernateJpaPersistenceProvider.createContainerEntityManagerFactory(SpringHibernateJpaPersistenceProvider.java:58) ~[spring-orm-5.2.7.RELEASE.jar:5.2.7.RELEASE]
at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.createNativeEntityManagerFactory(LocalContainerEntityManagerFactoryBean.java:365) ~[spring-orm-5.2.7.RELEASE.jar:5.2.7.RELEASE]
at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.buildNativeEntityManagerFactory(AbstractEntityManagerFactoryBean.java:391) ~[spring-orm-5.2.7.RELEASE.jar:5.2.7.RELEASE]
... 4 common frames omitted
如果您想将自定义 select 结果绑定到您的非实体对象,那么您必须这样做
@Getter
@AllArgsConstructor
class FullOrder {
private Long orderId;
private BigDecimal totalPrice;
}
@Repository
public interface CustomerOrderRepository extends CrudRepository<CustomerOrder, Long> {
@Query(query = "select new full.path.to.class.FullOrder(c.orderId, c.totalPrice) from CustomeOrder c")
List<FullOrder> findALlOrders();
}
Spring 数据将调用 FullOrder
的构造函数,因此 属性 order & 属性 type if matter
我在 Spring 中执行此操作,是 JPQL 的新手。我在查询中到底做错了什么(在 CustomerOrder class 中)?尝试通过几种方式来做到这一点,但我总是在那里得到那个例外。当我尝试@NamedNativeQuery 并通过 REST 端点进行查询时,出现语法异常。
第二个问题是我正在使用 spring.jpa.hibernate.ddl-auto,是否可以这样并且应该手动创建表?
这是第一个class。这是@OneToMany关系
@Entity
@Table(name = "customer")
public class Customer implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "customer_id")
private Long customerId;
@Column(name = "first_name")
private String firstName;
@Column(name = "last_name")
private String lastName;
@Column(name = "telephone")
private Long telephone;
@Column(name = "email")
private String email;
@Embedded
private Address address;
@OneToMany(mappedBy = "customer")
@JsonManagedReference
private List<CustomerOrder> orderList = new ArrayList<>();
public Customer() {
}
public Customer(String firstName, String lastName, Long telephone, String email, Address address) {
this.firstName = firstName;
this.lastName = lastName;
this.telephone = telephone;
this.email = email;
this.address = new Address(address);
}
这是关系的第二部分
@Entity
@Table(name = "customer_order")
@NamedQuery(query =
"SELECT c.customerId, " +
"c.firstName, " +
"c.lastName," +
" c.telephone, " +
"c.email, " +
"c.address.country," +
" c.address.houseNumber, " +
"c.address.apartmentNumber, " +
"c.address.postalCode," +
" c.address.postalCode, " +
"o.orderId, " +
"o.totalPrice, " +
" o.totalQuantity, " +
"o.cartItems " +
"FROM CustomerOrder o JOIN o.customer c", name = "Order.query")
public class CustomerOrder implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "order_id")
private Long orderId;
@ElementCollection
@CollectionTable(name = "cart_items", joinColumns = @JoinColumn(name = "order_id"))
private List<CartItem> cartItems;
@Column(name = "total_price")
private BigDecimal totalPrice;
@Column(name = "total_quantity")
private Integer totalQuantity;
@ManyToOne(cascade = CascadeType.ALL)
@JsonBackReference
@JoinColumn(name = "customer_id")
private Customer customer;
public CustomerOrder() {
}
public CustomerOrder(List<CartItem> items , CustomerOrderRequest request) {
this.cartItems = new LinkedList<>(items);
this.totalPrice = request.getTotalPrice();
this.totalQuantity = request.getTotalQuantity();
}
存储库:
import java.util.List;
@Repository
public interface CustomerOrderRepository extends CrudRepository<CustomerOrder, Long> {
@Query(name = "Order.query")
List<FullOrder> findALlOrders();
}
这是class所有数据应该映射到的。
public class FullOrder {
private Long customerId;
private String firstName;
private String lastName;
private Long telephone;
private String email;
private String country;
private Integer houseNumber;
private Integer apartmentNumber;
private String postalCode;
private String city;
private Long orderId;
private BigDecimal totalPrice;
private Integer totalQuantity;
private List<CartItem> cartItems;
const. getters setters etc.
异常:
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'roleRepository' defined in luke.shopbackend.repository.RoleRepository defined in @EnableJpaRepositories declared on JpaRepositoriesRegistrar.EnableJpaRepositoriesConfiguration: Cannot resolve reference to bean 'jpaMappingContext' while setting bean property 'mappingContext'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'jpaMappingContext': Invocation of init method failed; nested exception is javax.persistence.PersistenceException: [PersistenceUnit: default] Unable to build Hibernate SessionFactory; nested exception is org.hibernate.HibernateException: Errors in named queries:
Order.query failed because of: org.hibernate.QueryException: not an entity [SELECT c.customerId, c.firstName, c.lastName, c.telephone, c.email, c.address.country, c.address.houseNumber, c.address.apartmentNumber, c.address.postalCode, c.address.postalCode, o.orderId, o.totalPrice, o.totalQuantity, o.cartItems FROM luke.shopbackend.model.entity.CustomerOrder o JOIN o.customer c]
at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveReference(BeanDefinitionValueResolver.java:342) ~[spring-beans-5.2.7.RELEASE.jar:5.2.7.RELEASE]
at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveValueIfNecessary(BeanDefinitionValueResolver.java:113) ~[spring-beans-5.2.7.RELEASE.jar:5.2.7.RELEASE]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyPropertyValues(AbstractAutowireCapableBeanFactory.java:1699) ~[spring-beans-5.2.7.RELEASE.jar:5.2.7.RELEASE]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1444) ~[spring-beans-5.2.7.RELEASE.jar:5.2.7.RELEASE]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:594) ~[spring-beans-5.2.7.RELEASE.jar:5.2.7.RELEASE]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:517) ~[spring-beans-5.2.7.RELEASE.jar:5.2.7.RELEASE]
at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean[=15=](AbstractBeanFactory.java:323) ~[spring-beans-5.2.7.RELEASE.jar:5.2.7.RELEASE]
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:226) ~[spring-beans-5.2.7.RELEASE.jar:5.2.7.RELEASE]
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:321) ~[spring-beans-5.2.7.RELEASE.jar:5.2.7.RELEASE]
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:202) ~[spring-beans-5.2.7.RELEASE.jar:5.2.7.RELEASE]
at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBeansOfType(DefaultListableBeanFactory.java:621) ~[spring-beans-5.2.7.RELEASE.jar:5.2.7.RELEASE]
at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBeansOfType(DefaultListableBeanFactory.java:609) ~[spring-beans-5.2.7.RELEASE.jar:5.2.7.RELEASE]
at org.springframework.data.repository.config.DeferredRepositoryInitializationListener.onApplicationEvent(DeferredRepositoryInitializationListener.java:51) ~[spring-data-commons-2.3.1.RELEASE.jar:2.3.1.RELEASE]
at org.springframework.data.repository.config.DeferredRepositoryInitializationListener.onApplicationEvent(DeferredRepositoryInitializationListener.java:36) ~[spring-data-commons-2.3.1.RELEASE.jar:2.3.1.RELEASE]
at org.springframework.context.event.SimpleApplicationEventMulticaster.doInvokeListener(SimpleApplicationEventMulticaster.java:172) ~[spring-context-5.2.7.RELEASE.jar:5.2.7.RELEASE]
at org.springframework.context.event.SimpleApplicationEventMulticaster.invokeListener(SimpleApplicationEventMulticaster.java:165) ~[spring-context-5.2.7.RELEASE.jar:5.2.7.RELEASE]
at org.springframework.context.event.SimpleApplicationEventMulticaster.multicastEvent(SimpleApplicationEventMulticaster.java:139) ~[spring-context-5.2.7.RELEASE.jar:5.2.7.RELEASE]
at org.springframework.context.support.AbstractApplicationContext.publishEvent(AbstractApplicationContext.java:404) ~[spring-context-5.2.7.RELEASE.jar:5.2.7.RELEASE]
at org.springframework.context.support.AbstractApplicationContext.publishEvent(AbstractApplicationContext.java:361) ~[spring-context-5.2.7.RELEASE.jar:5.2.7.RELEASE]
at org.springframework.context.support.AbstractApplicationContext.finishRefresh(AbstractApplicationContext.java:898) ~[spring-context-5.2.7.RELEASE.jar:5.2.7.RELEASE]
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:554) ~[spring-context-5.2.7.RELEASE.jar:5.2.7.RELEASE]
at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:143) ~[spring-boot-2.3.1.RELEASE.jar:2.3.1.RELEASE]
at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:758) ~[spring-boot-2.3.1.RELEASE.jar:2.3.1.RELEASE]
at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:750) ~[spring-boot-2.3.1.RELEASE.jar:2.3.1.RELEASE]
at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:397) ~[spring-boot-2.3.1.RELEASE.jar:2.3.1.RELEASE]
at org.springframework.boot.SpringApplication.run(SpringApplication.java:315) ~[spring-boot-2.3.1.RELEASE.jar:2.3.1.RELEASE]
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1237) ~[spring-boot-2.3.1.RELEASE.jar:2.3.1.RELEASE]
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1226) ~[spring-boot-2.3.1.RELEASE.jar:2.3.1.RELEASE]
at luke.shopbackend.ShopBackendApplication.main(ShopBackendApplication.java:11) ~[classes/:na]
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na]
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:na]
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na]
at java.base/java.lang.reflect.Method.invoke(Method.java:564) ~[na:na]
at org.springframework.boot.devtools.restart.RestartLauncher.run(RestartLauncher.java:49) ~[spring-boot-devtools-2.3.1.RELEASE.jar:2.3.1.RELEASE]
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'jpaMappingContext': Invocation of init method failed; nested exception is javax.persistence.PersistenceException: [PersistenceUnit: default] Unable to build Hibernate SessionFactory; nested exception is org.hibernate.HibernateException: Errors in named queries:
Order.query failed because of: org.hibernate.QueryException: not an entity [SELECT c.customerId, c.firstName, c.lastName, c.telephone, c.email, c.address.country, c.address.houseNumber, c.address.apartmentNumber, c.address.postalCode, c.address.postalCode, o.orderId, o.totalPrice, o.totalQuantity, o.cartItems FROM luke.shopbackend.model.entity.CustomerOrder o JOIN o.customer c]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1796) ~[spring-beans-5.2.7.RELEASE.jar:5.2.7.RELEASE]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:595) ~[spring-beans-5.2.7.RELEASE.jar:5.2.7.RELEASE]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:517) ~[spring-beans-5.2.7.RELEASE.jar:5.2.7.RELEASE]
at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean[=15=](AbstractBeanFactory.java:323) ~[spring-beans-5.2.7.RELEASE.jar:5.2.7.RELEASE]
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:226) ~[spring-beans-5.2.7.RELEASE.jar:5.2.7.RELEASE]
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:321) ~[spring-beans-5.2.7.RELEASE.jar:5.2.7.RELEASE]
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:202) ~[spring-beans-5.2.7.RELEASE.jar:5.2.7.RELEASE]
at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveReference(BeanDefinitionValueResolver.java:330) ~[spring-beans-5.2.7.RELEASE.jar:5.2.7.RELEASE]
... 33 common frames omitted
Caused by: javax.persistence.PersistenceException: [PersistenceUnit: default] Unable to build Hibernate SessionFactory; nested exception is org.hibernate.HibernateException: Errors in named queries:
Order.query failed because of: org.hibernate.QueryException: not an entity [SELECT c.customerId, c.firstName, c.lastName, c.telephone, c.email, c.address.country, c.address.houseNumber, c.address.apartmentNumber, c.address.postalCode, c.address.postalCode, o.orderId, o.totalPrice, o.totalQuantity, o.cartItems FROM luke.shopbackend.model.entity.CustomerOrder o JOIN o.customer c]
at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.buildNativeEntityManagerFactory(AbstractEntityManagerFactoryBean.java:403) ~[spring-orm-5.2.7.RELEASE.jar:5.2.7.RELEASE]
at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264) ~[na:na]
at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1130) ~[na:na]
at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:630) ~[na:na]
at java.base/java.lang.Thread.run(Thread.java:832) ~[na:na]
Caused by: org.hibernate.HibernateException: Errors in named queries:
Order.query failed because of: org.hibernate.QueryException: not an entity [SELECT c.customerId, c.firstName, c.lastName, c.telephone, c.email, c.address.country, c.address.houseNumber, c.address.apartmentNumber, c.address.postalCode, c.address.postalCode, o.orderId, o.totalPrice, o.totalQuantity, o.cartItems FROM luke.shopbackend.model.entity.CustomerOrder o JOIN o.customer c]
at org.hibernate.internal.SessionFactoryImpl.<init>(SessionFactoryImpl.java:341) ~[hibernate-core-5.4.17.Final.jar:5.4.17.Final]
at org.hibernate.boot.internal.SessionFactoryBuilderImpl.build(SessionFactoryBuilderImpl.java:469) ~[hibernate-core-5.4.17.Final.jar:5.4.17.Final]
at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:1259) ~[hibernate-core-5.4.17.Final.jar:5.4.17.Final]
at org.springframework.orm.jpa.vendor.SpringHibernateJpaPersistenceProvider.createContainerEntityManagerFactory(SpringHibernateJpaPersistenceProvider.java:58) ~[spring-orm-5.2.7.RELEASE.jar:5.2.7.RELEASE]
at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.createNativeEntityManagerFactory(LocalContainerEntityManagerFactoryBean.java:365) ~[spring-orm-5.2.7.RELEASE.jar:5.2.7.RELEASE]
at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.buildNativeEntityManagerFactory(AbstractEntityManagerFactoryBean.java:391) ~[spring-orm-5.2.7.RELEASE.jar:5.2.7.RELEASE]
... 4 common frames omitted
如果您想将自定义 select 结果绑定到您的非实体对象,那么您必须这样做
@Getter
@AllArgsConstructor
class FullOrder {
private Long orderId;
private BigDecimal totalPrice;
}
@Repository
public interface CustomerOrderRepository extends CrudRepository<CustomerOrder, Long> {
@Query(query = "select new full.path.to.class.FullOrder(c.orderId, c.totalPrice) from CustomeOrder c")
List<FullOrder> findALlOrders();
}
Spring 数据将调用 FullOrder
的构造函数,因此 属性 order & 属性 type if matter