2017-03-13 164 views
1

我有以下API中CrudRepository春天開機JPA不工作

public static final String getVendorOrder ="select new com.meha.ps.order.dto.VendorOrder(orderItem.vendorItemId" 
     + ",order.orderId" 
     + ",order.createTime" 
     + ",order.modTime " 
     + ",org.orgId" 
     + ",org.orgType" 
     + ") from Order order inner join order.OrderItem orderItem on order.orderId=orderItem.orderId" 
     + " inner join Org org on org.orgId=orderItem.vendorId" 
     + " where orderItem.vendorItemId in :vendorItemIds"; 

@Query(getVendorOrder) 
List<VendorOrder> findVendorOrder(@Param("vendorItemIds") List<Integer> vendorItemIds); 

在啓動時得到如下錯誤:

Caused by: java.lang.IllegalArgumentException: org.hibernate.hql.internal.ast.QuerySyntaxException: unexpected token: order near line 1, column 193 [select new com.meha.ps.order.dto.VendorOrder(orderItem.vendorItemId,order.orderId,order.createTime,order.modTime ,org.orgId,org.orgType) from com.meha.ps.order.entities.Order order inner join order.OrderItem orderItem on order.orderId=orderItem.orderId inner join Org org on org.orgId=orderItem.vendorId where orderItem.vendorItemId in :vendorItemIds] 
at org.hibernate.jpa.spi.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1679) ~[hibernate-entitymanager-5.0.11.Final.jar:5.0.11.Final] 
at org.hibernate.jpa.spi.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1602) ~[hibernate-entitymanager-5.0.11.Final.jar:5.0.11.Final] 
at org.hibernate.jpa.spi.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1608) ~[hibernate-entitymanager-5.0.11.Final.jar:5.0.11.Final] 
at org.hibernate.jpa.spi.AbstractEntityManagerImpl.createQuery(AbstractEntityManagerImpl.java:294) ~[hibernate-entitymanager-5.0.11.Final.jar:5.0.11.Final] 
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_65] 
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:1.8.0_65] 
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_65] 
at java.lang.reflect.Method.invoke(Method.java:497) ~[na:1.8.0_65] 
at org.springframework.orm.jpa.ExtendedEntityManagerCreator$ExtendedEntityManagerInvocationHandler.invoke(ExtendedEntityManagerCreator.java:347) ~[spring-orm-4.3.5.RELEASE.jar:4.3.5.RELEASE] 
at com.sun.proxy.$Proxy114.createQuery(Unknown Source) ~[na:na] 
at org.springframework.data.jpa.repository.query.SimpleJpaQuery.validateQuery(SimpleJpaQuery.java:86) ~[spring-data-jpa-1.10.6.RELEASE.jar:na] 
... 95 common frames omitted 

產生的原因:org.hibernate.hql.internal.ast.QuerySyntaxException :意外標記:在第1行第193列附近排序[select new com.meha.ps.order.dto.VendorOrder(orderItem.vendorItemId,order.orderId,order.createTime,order.modTime,org.orgId,org.orgType)來自com.meha.ps.order.entities.Order訂單內部連接order.OrderItem orderItem on order.orderId = orderItem.orderId內部連接Org org on org.orgId = orderItem.vendorId where orderItem.vendorItemId in:vendorItemIds] at org.hibernate.hql.internal.ast.QuerySyntaxException.convert(QuerySyntaxException.java:74)〜[hibernate-core-5.0.11.Final.jar :5.0.11.Final] at org.hibernate.hql.internal.ast.ErrorCounter.throwQueryException(ErrorCounter.java:91)〜[hibernate-core-5.0.11.Final.jar:5.0.11.Final] at org.hibernate.hql.internal.ast.QueryTranslatorImpl.parse(QueryTranslatorImpl.java:288)〜[hibernate-core-5.0.11.Final.jar:5.0.11.Final] at org.hibernate.hql.internal .ast.QueryTranslatorImpl.doCompile(QueryTranslatorImpl.java:187)〜[hibernate-core-5.0.11.Final.jar:5.0.11.Final] at org.hibernate.hql.internal.ast.QueryTranslatorImpl.compile(QueryTranslatorImpl .java:142)〜[hibernate-core-5.0.11.Final.jar:5.0.11.Final] at org.hibernate.engine.qu HQLQueryPlan。(HQLQueryPlan.java:115)〜[hibernate-core-5.0.11.Final.jar:5.0.11.Final] at org.hibernate.engine.query.spi.HQLQueryPlan。(HQLQueryPlan。 java:76)〜[hibernate-core-5.0.11.Final.jar:5.0.11.Final] at org.hibernate.engine.query.spi.QueryPlanCache.getHQLQueryPlan(QueryPlanCache.java:150)〜[hibernate- core-5.0.11.Final.jar:5.0.11.Final] at org.hibernate.internal.AbstractSessionImpl.getHQLQueryPlan(AbstractSessionImpl.java:302)〜[hibernate-core-5.0.11.Final.jar:5.0。 11.Final] at org.hibernate.internal.AbstractSessionImpl.createQuery(AbstractSessionImpl.java:240)〜[hibernate-core-5.0.11.Final.jar:5.0.11.Final] at org.hibernate.internal。 SessionImpl.createQuery(SessionImpl.java:1894)〜[hibernate-core-5.0.11.Final.jar:5.0.11.Final] at org.hibernate.jpa.spi.AbstractEntityManagerImpl.creat eQuery(AbstractEntityManagerImpl.java:291)〜[hibernate-entitymanager-5.0.11.Final.jar:5.0.11.Final] ... 102通用幀被省略

+0

添加這些3個實體IMPL ..只能是它們之間的依賴關係的映射 –

+1

你應該不在查詢中添加新的關鍵字。從查詢中刪除該對象創建部分,然後重試。 '選擇orderItem.vendorItemId 「 +」,order.orderId 「 +」,order.createTime 「 +」,order.modTime 「 +」,org.orgId 「 +」,org.orgType 「 +」 從Order order inner join order.OrderItem orderItem on order.orderId = orderItem.orderId「 +」inner join Org org on org.orgId = orderItem.vendorId「 +」where orderItem.vendorItemId in:vendorItemIds' –

+0

@Maciej Kowalski,There在OneToMany的Order和OrderItem之間映射,但Org和OrderItem之間沒有映射,但OrderItem存儲來自Org的orgId,我們可以在這種情況下編寫hibernate查詢嗎? –

回答

0

如果沒有直接映射實體的話,我會建議使用舊式加入一路(查詢的其餘部分似乎好):

select new com.meha.ps.order.dto.VendorOrder(orderItem.vendorItemId" 
     + ",order.orderId" 
     + ",order.createTime" 
     + ",order.modTime " 
     + ",org.orgId" 
     + ",org.orgType" 
     + ") from Order order, OrderItem orderItem, Org org  
      where order.orderId=orderItem.orderId" 
     + " and org.orgId=orderItem.vendorId" 
     + " and orderItem.vendorItemId in :vendorItemIds"; 
+0

謝謝Maciej Kowalski,那工作.. –

+0

太好了。很高興我能幫上忙 –