我有一个表product_spec_entry,其中包含以下列:
- 产品规格ID
- 商品规格ID
对于一个product_spec_id,可以是多个commodity_spec_id,例如:
|product_spec_id | commodity_spec_id|
|----------------|------------------|
|1683 |1681 |
|1692 |1693 |
|1692 |1681 |
|1692 |1687 |
|1692 |1864 |
|1860 |1681 |
|1868 |1681 |
|1868 |1864 |
字符串
我想得到所有product_spec_id,所有commodity_spec_id都作为参数传递。
我写了下一个查询:
SELECT ps.product_spec_id, commodities
FROM (
SELECT
product_spec_id,
array_agg(commodity_spec_id) AS commodities
FROM system.product_spec_entry
GROUP BY product_spec_id) ps
WHERE Cast(ARRAY [1681, 1864] as BIGINT[]) <@ Cast(ps.commodities as BIGINT[]);
型
它工作正常,并返回预期结果:
product_spec_id = 1692,1868
我尝试将此查询用于JPA原生查询:
String query = "SELECT ps.product_spec_id " +
"FROM ( " +
" SELECT " +
" product_spec_id, " +
" array_agg(commodity_spec_id) AS commodities " +
" FROM system.product_spec_entry " +
" GROUP BY product_spec_id) ps " +
"WHERE CAST(ARRAY[:commoditySpecIds] AS BIGINT[]) <@ CAST(ps.commodities AS BIGINT[])";
List<Long> commoditySpecsIds = commoditySpecs.stream().map(Spec::getId).collect(Collectors.toList());
List<BigInteger> productSpecIds = em.createNativeQuery(query).setParameter("commoditySpecIds", commoditySpecsIds)
.getResultList();
型
它不起作用,因为我得到的是记录数组(ARRAY[(1692, 1868)]
),而不是bigint数组(ARRAY[1692, 1868]
)。
我应该如何绑定数组参数到我的查询?也许我可以使用更简单的查询。
4条答案
按热度按时间q5lcpyga1#
从SQL中删除
array[...]
:字符串
然后将ID列表作为字符串传递,如下所示:
型
Lists的默认toString()通常返回类似于:
"[1,2,3]"
的内容,所以你可以这样做:型
然后将其传递给混淆层:
型
pinkon5k2#
我也是一样的情况,希望@VladMihalcea能帮助我们
编辑
我想用JPA来做。在阅读setParameter的实现之后,我发现了一些类似于UserType的东西,即TypedParameterValue。
当您使用
字符串
其中IntArrayType. BIDANCE来自Vlad Mihalcea提供的“hibernate-types”库。请注意,“commoditySpecsIds”必须是数组,而不是Collection。
希望有帮助
cgvd09ve3#
对于您的情况,其他方法是打开JPA提供程序会话,并使用JPA提供程序API中的一些方法。
如果你正在使用Hibernate,你可以这样做:
字符串
然后也使用hibernate API设置参数
型
其中“ArrayTypeUser”是一个自定义类型,它将PostgreSQL数组类型Map到Java数组类型。
这不是最好的解决方案,但由于您已经在使用本机查询,因此对于这种特殊情况,最好的解决方案可能是跳过JPA标准API,使用JPA提供的API。
pbpqsu0x4#
其实答案很简单--你应该在这里使用Array而不是List。
字符串
指纹
型