我尝试为我的商店应用程序编写一个搜索查询,它包括 IN 子句的使用和绑定一组 ID。虽然硬编码值工作良好(如“(1, 3, 5)”),但 Hibernate 似乎无法绑定传递的集合 (
producersIDs
)。
编辑:“IS NULL”检查结果是问题所在,但仍然很高兴知道为什么以及另一种处理它的方法是什么,现在我有:
(:emptyProducersIDs = TRUE OR p.producer.id IN :producersIDs)
.setParameter("emptyProducersIDs", isEmpty(p.producersIDs()))
public List<ProductDTO> find(ProductSearchDTO p) {
String query = "SELECT new shop.coffeenook.dto.ProductDTO(" +
"p.name, p.description, p.euroPrice, p.producer.id, p.caffeineMilligrams, p.availableAmount) " +
"FROM Product p " +
"WHERE (:name IS NULL OR p.name LIKE CONCAT('%', :name, '%')) " +
"AND ((:minPrice IS NULL OR p.euroPrice >= :minPrice) " +
"AND (:maxPrice IS NULL OR p.euroPrice <= :maxPrice)) " +
"AND (:producersIDs IS NULL OR p.producer.id IN :producersIDs)" +
"AND ((:minCaffeine IS NULL OR p.caffeineMilligrams >= :minCaffeine) " +
"AND (:maxCaffeine IS NULL OR p.caffeineMilligrams <= :maxCaffeine)) " +
"AND (:minAmount IS NULL OR p.availableAmount >= :minAmount)";
return em.createQuery(query, ProductDTO.class)
.setParameter("name", p.name())
.setParameter("minPrice", p.minPrice())
.setParameter("maxPrice", p.maxPrice())
.setParameter("producersIDs", p.producersIDs())
.setParameter("minCaffeine", p.minCaffeine())
.setParameter("maxCaffeine", p.maxCaffeine())
.setParameter("minAmount", p.minAmount())
.getResultList();
}
java.lang.IllegalArgumentException: Parameter value [[1]] did not match expected type [SqmBasicValuedSimplePath(shop.coffeenook.product.Product(p).producer.id)]
at org.hibernate.query.internal.QueryParameterBindingImpl.setBindValue(QueryParameterBindingImpl.java:124)
at org.hibernate.query.spi.AbstractCommonQueryContract.setParameter(AbstractCommonQueryContract.java:835)
at org.hibernate.query.spi.AbstractSelectionQuery.setParameter(AbstractSelectionQuery.java:900)
at org.hibernate.query.sqm.internal.QuerySqmImpl.setParameter(QuerySqmImpl.java:1258)
at org.hibernate.query.sqm.internal.QuerySqmImpl.setParameter(QuerySqmImpl.java:140)
at shop.coffeenook.product.ProductRepository.find(ProductRepository.java:37)
at shop.coffeenook.product.ProductRepository_ClientProxy.find(Unknown Source)
at shop.coffeenook.product.ProductService.find(ProductService.java:32)
at shop.coffeenook.product.ProductService_ClientProxy.find(Unknown Source)
at shop.coffeenook.product.ProductResource.find(ProductResource.java:33)
at shop.coffeenook.product.ProductResource$quarkusrestinvoker$find_5dcac52244cce907a28f72e8944faa96f5e1384d.invoke(Unknown Source)
at org.jboss.resteasy.reactive.server.handlers.InvocationHandler.handle(InvocationHandler.java:29)
at io.quarkus.resteasy.reactive.server.runtime.QuarkusResteasyReactiveRequestContext.invokeHandler(QuarkusResteasyReactiveRequestContext.java:141)
at org.jboss.resteasy.reactive.common.core.AbstractResteasyReactiveContext.run(AbstractResteasyReactiveContext.java:147)
at io.quarkus.vertx.core.runtime.VertxCoreRecorder$14.runWith(VertxCoreRecorder.java:599)
at org.jboss.threads.EnhancedQueueExecutor$Task.doRunWith(EnhancedQueueExecutor.java:2516)
at org.jboss.threads.EnhancedQueueExecutor$Task.run(EnhancedQueueExecutor.java:2495)
at org.jboss.threads.EnhancedQueueExecutor$ThreadBody.run(EnhancedQueueExecutor.java:1521)
at org.jboss.threads.DelegatingRunnable.run(DelegatingRunnable.java:11)
at org.jboss.threads.ThreadLocalResettingRunnable.run(ThreadLocalResettingRunnable.java:11)
at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30)
at java.base/java.lang.Thread.run(Thread.java:1583)
Caused by: org.hibernate.type.descriptor.java.CoercionException: Cannot coerce value '[1]' [java.util.HashSet] to Long
at org.hibernate.type.descriptor.java.LongJavaType.coerce(LongJavaType.java:157)
at org.hibernate.type.descriptor.java.LongJavaType.coerce(LongJavaType.java:24)
at org.hibernate.query.internal.QueryParameterBindingImpl.coerce(QueryParameterBindingImpl.java:164)
at org.hibernate.query.internal.QueryParameterBindingImpl.setBindValue(QueryParameterBindingImpl.java:113)
我已经尝试过一些东西,例如数组或列表/将其用大括号括起来,但没有任何效果。
也许可以尝试
((:producersIDs) IS NULL OR p.producer.id IN (:producersIDs))
?
否则...p.producersIDs()
是什么类型?