I got this list of coins that i want to filter with that 3 optional parameters(Currency, quantity and year)
如何将JPQL中的参数设置为可选?我不想做9“如果其他”检查是否为空
我得到了函数filtradoMonedas(filterCoins),它使用3个可选参数过滤对象Moneda(coin),但如果有空参数,它就不工作。
如果不设置空参数,如果cantidad或ano是“”,则返回错误查询的异常,则此操作可以正常工作。只是想把它作为可选的。方法如下:
public List<Moneda> filtradoMonedas(Divisa divisa, BigDecimal cantidad,
BigDecimal ano){
EntityManager em = getEntityManager();
Query consulta = em.createQuery("SELECT m FROM Moneda m "
+ "WHERE m.divisa = :divisa "
+ "AND m.cantidad= :cantidad "
+ "AND m.ano = :ano");
consulta.setParameter("divisa", divisa);
consulta.setParameter("cantidad", cantidad);
consulta.setParameter("ano", ano);
List<Moneda> filtradoMonedas = (List<Moneda>) consulta.getResultList();
// sincronizar los objetos devueltos con la base de datos
for (Moneda m : filtradoMonedas) {
em.refresh(m);
}
em.close();
return filtradoMonedas;
}
4条答案
按热度按时间kgsdhlau1#
在阅读了Ilya Dyoshin的评论和他的聪明想法 “你应该认为不是参数是可选的,而是条件是可选的” 之后,我决定走自己的路,使用带有@Query注解的JPQL,并创建一个工作得很好的动态SQL查询。
关键是应用一些SQL逻辑来使条件而不是参数成为可选的:
请注意,️在这里,我使用了一个OR语句,因为我的参数可以表示两种形式,FilterSuperAwesome示例或NULL。如果为NULL,则条件始终为True,就好像它不存在一样。
这在JHipster项目的JpaRepository类中运行得很好。
4dc9hkyq2#
JPQL不支持可选参数。
实际上,你应该认为不是参数是可选的,而是条件是可选的。这个想法将引导您创建“动态”查询。这将引导您从JPQL切换到Criteria API。这将导致你写这样的东西:
myzjeezk3#
在我的例子中,我的可选参数是
List<String>
,解决方案如下:这样:
为什么是
COALESCE
,为什么里面有一个 null 值?让我们探索所有条件下的
WHERE
子句:案例一:
categories = null
COALESCE
将返回第一个非空值(如果存在),并返回null(如果所有参数均为null)。案例二:
categories = ()
JPA会自动将空列表标识为null值,因此结果与案例1相同。
案例三:
categories = ('ONE_VALUE')
COLUMN_X = 'ONE_VALUE'
返回true,而 OR 的右半部分永远不会返回true,因为它等于'ONE_VALUE' IS NULL
(即false)。为什么要把null作为第二个参数?这是因为
COALESCE
至少需要两个参数。案例四:
categories = ('ONE_VALUE', 'TWO_VALUE')
与情况3一样,OR 运算符的左边部分将只选择
COLUMN_X
等于'ONE_VALUE'
或'TWO_VALUE'
的行。hc2pp10m4#
这对于原生查询,当参数值需要是可选的时,只需传递空值。检查查询中参数是否为null。