如何将空列表发送到 IN 子句

Pet*_*zov 5 java jpa jpa-2.0 spring-data-jpa

我想使用这个 SQL 查询:

String hql = "select e from " + Terminals.class.getName() + " e WHERE e.merchantId IN :merchant_ids";
        TypedQuery<Terminals> query = entityManager.createQuery(hql, Terminals.class).setParameter("merchant_ids", merchant_ids);
        List<Terminals> merchants = query.getResultList();
Run Code Online (Sandbox Code Playgroud)

但我收到错误:the right syntax to use near ')所以 IN 子句列表IN (....)不能为空。这个问题有解决办法吗?

Joo*_*gen 5

不执行查询是允许的,甚至很好:

if (merchant_ids.isEmpty()) {
    return new ArrayList<>();
} else {
    String hql = "select e from " + Terminals.class.getName()
            + " e WHERE e.merchantId IN :merchant_ids";
   return entityManager.createQuery(hql, Terminals.class)
        .setParameter("merchant_ids", merchant_ids)
        .getResultList();
}
Run Code Online (Sandbox Code Playgroud)

我不知道如果通过null而不是空列表会发生什么;SQL... IN NULL就可以做到。另一方面,它可能会执行全表扫描以返回 0 个结果。

如果x IN()不会产生 0 条记录(当存在 时OR ...)则:

if (merchant_ids.isEmpty()) {
    merchant_ids.add(-1);
    String hql = "select e from " + Terminals.class.getName() + ...
Run Code Online (Sandbox Code Playgroud)


Ram*_*ler 0

I am not familiar with hibernate but since it is an SQL error, the following should work :

TypedQuery<Terminals> query = entityManager
.createQuery(hql, Terminals.class)
.setParameter("merchant_ids",merchant_ids.size()==0?null:merchant_ids);
Run Code Online (Sandbox Code Playgroud)

But as @Richard Barker mentioned , best solution is to not even execute the query when the list is empty. You will even save on the unnecessary database call , when you already know that the query is not going to return anything.