当前位置: 首页 > 知识库问答 >
问题:

spring boot JPA IN子句不工作

柯瀚海
2023-03-14

我在CrudRepository中有下面的API

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

由以下原因引起:ounter.java:91QuerySyntaException:意外令牌:第1行193列附近的订单[选择新的inal.jarVdororder(orderIorg.hibernate.hql.internal.ast.ItemId,mpl.parseId,mpl.java:288Time,inal.jarTime,org.hibernate.hql.internal.ast.Id,mpl.doType)从com.meha.ps.order.entities.订单内连接订单。order.order上的OrderItem orderItem Id=orderItem.orderId内连接org.orgId=orderItem.vendorId上的OrderItem.vendorItemId in: vdorItemIds]在org.hibernate.hql.internal.ast.QuerySyntaException.convert(QuerySyntaException.java:74)~[hibernate-core-5.0.11。Final.jar: 5.0.11。最终]在org.hibernate.hql.internal.ast.ErrorCounter.throwQueryException(ErrorCorg.hibernate.hql.internal.ast.)~[hibernate-core-5.0.11。Fcom.meha.ps.order.dto.: 5.0.11。最终]在tem.vendorQueryTranslatorIorder.order(QueryTranslatorIorder.create)~[hibernate-core-5.0.11。Forder.mod: 5.0.11。最终]在org.orgQueryTranslatorIorg.org编译(QueryTransHQLQueryPlan. java: 115)~[hibernate-core-5.0.11。Final. jar:5.0.11。最终]在org. hibernate. Engine. query. spi。HQLQueryPlan。(HQLQueryPlan. java: 76)~[hibernate-core-5.0.11。最终. jar:5.0.11。最终]在org. hibernate. Engine. query. spi。QueryPlanCache. getHQLQueryPlan(QueryPlanCache. java: 150)~[hibernate-core-5.0.11。最终. jar:5.0.11。最终]在org. hibernate. interal。AbstractSessionInp. getHQLQueryPlan(AbstractSessionInp. java: 302)~[hibernate-core-5.0.11。最终. jar:5.0.11。最终]在org. hibernate. interal。Abstract

共有1个答案

贾骏喆
2023-03-14

如果某些实体之间没有直接映射,那么我建议一直使用旧式连接(查询的其余部分似乎没有问题):

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";
 类似资料:
  • 我有一个问题。我写了代码,需要指出数组的元素比数组的下一个元素大。您可以在输出图片上看到数组$arr应该只包含元素70,因为

  • 我有一个RecyclizerView,它列出了来自服务器的数据,它必须根据条件以不同的方式显示每行数据。我的数据是票证消息的列表。如果消息是从用户发送的,则其背景必须为灰色,如果来自代理,则必须为蓝色。此外,如果此邮件有附件,则必须显示下载图标。这是我的适配器代码: 颜色设置正确,但是当我使用if子句设置图像查看附件时,没有附件且为空的邮件将显示该附件图标!我是否也应该在 getItemType

  • 问题内容: 我正在寻找关于在包含多个表的查询中DISTINCT子句如何在SQL(SQL Server 2008,如果有所作为)中工作的答案? 我的意思是SQL引擎如何使用DISTINCT子句处理查询? 我问的原因是,我经验丰富的同事告诉我SQL将DISTINCT应用于每个表的每个字段。对我来说似乎不太可能,但我想确保…。 例如,有两个表: 然后有这个查询: 假设有两个角色的用户,则上面的查询将返回

  • 我有以下QueryDSL查询: 它使用计数,因为这是Spring数据用来对结果进行分页的第一个查询。

  • 我为Select创建了动态DB2存储过程。我将使用这个泛型查询通过传递参数来执行多个select语句。 下面是我的查询的样子。 当我运行这个的时候

  • 问题内容: 当我们执行此操作时,将不会有任何结果 我的问题是: 以上查询在逻辑上等效于 就像上面的声明一样,不会有任何结果 请说清楚? 问题答案: 正确(但请注意,这是一个运算符,而不是一个子句,它通常在SQL中这样工作,不仅适用于Oracle)。 等效于: 实际应该写成: 和 与以下内容相同: 结果为: 并进一步作为: 因此,它正确不返回任何行。 请注意,如果您有,它将评估为(在练习中保留),并