Hibernate 6 - IN 子句/绑定集合

问题描述 投票:0回答:1

我尝试为我的商店应用程序编写一个搜索查询,它包括 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)

我已经尝试过一些东西,例如数组或列表/将其用大括号括起来,但没有任何效果。

java hibernate jpql in-clause
1个回答
0
投票

也许可以尝试

((:producersIDs) IS NULL OR p.producer.id IN (:producersIDs))
? 否则...
p.producersIDs()
是什么类型?

© www.soinside.com 2019 - 2024. All rights reserved.