Setting a parameter as a list for an IN expression

前端 未结 9 2491
北荒
北荒 2020-11-30 07:14

Whenever I try to set a list as a parameter for use in an IN expression I get an Illegal argument exception. Various posts on the internet seem to indicate that this is poss

相关标签:
9条回答
  • 2020-11-30 08:03

    Hope this helps some one. I have faced the issue and did the following to resolve (using eclipselink 2.2.0)

    1. I had JavaEE jar as well as jpa 2 jar(javax.persistence*2*) in the class path. Removed the JavaEE from the class path.

    2. I was using something like " idItm IN ( :itemIds ) " which was throwing the exception :

    type class java.util.ArrayList for parameter itemIds with expected type of class java.lang.String from query string

    Solution: I just changed the in condition to " idItm IN :itemIds ", i.e. I removed the brackets ().

    0 讨论(0)
  • 2020-11-30 08:04

    Your JPQL is invalid, remove the brackets

    List<String> logins = em.createQuery("SELECT a.accountManager.loginName " +
        "FROM Account a " +
        "WHERE a.id IN :ids")
        .setParameter("ids",Arrays.asList(new Long(1000100), new Long(1000110)))
        .getResultList();
    
    0 讨论(0)
  • 2020-11-30 08:07

    I found the answer, providing a list as a parameter is not supported in JPA 1.0; however, it is supported in JPA 2.0.

    The default persistence provider for Glassfish v2.1 is Toplink which implements JPA 1.0, to get JPA 2.0 you need EclipseLink which is the default for the Glassfish v3 preview or can be plugged into v2.1.

    - Loren

    0 讨论(0)
  • 2020-11-30 08:08

    Use NamedQuery instead:

    List<String> logins = em.createNamedQuery("Account.findByIdList").setParameter("ids", Arrays.asList(new Long(1000100), new Long(1000110))).getResultList();
    

    Add the named query to your entity

    @NamedQuery(name = "Account.findByIdList", query = "SELECT a.accountManager.loginName FROM Account a WHERE a.id IN :ids")
    
    0 讨论(0)
  • 2020-11-30 08:13

    Simply, the parameter will be List and set it as

    "...WHERE a.id IN (:ids)")
    .setParameter("ids", yourlist)
    

    This works for JPA 1.0

    0 讨论(0)
  • 2020-11-30 08:14

    Try this code instead of the one supplied by @Szymon Tarnowski to add the OR list.. warning if you have hundreds of IDs though, you might break whatever limit is in place regarding the max length of a query.

    /**
     * @param field
     *           The jpql notation for the field you want to evaluate
     * @param collection
     *           The collection of objects you want to test against
     * @return Jpql that can be concatenated into a query to test if a feild is
     *         in a collection of objects
     */
    public static String in(String field, List<Integer> idList) {
      StringBuilder sb = new StringBuilder();
      sb.append(" AND (");
      for(Integer id : idList) {
        sb.append(" ").append(field).append(" = '").append(id).append("'").append(" OR ");
      }
      String result = sb.toString();
      result = result.substring(0, result.length() - 4); // Remove last OR
      result += ")";
      return result;
    }
    

    To test this:

    public static void main(String[] args) {
      ArrayList<Integer> list = new ArrayList<Integer>();
      list.add(122);
      list.add(132);
      list.add(112);
      System.out.println(in("myfield", list));
    }
    

    Which gave output: AND ( myfield = '122' OR myfield = '132' OR myfield = '112')

    0 讨论(0)
提交回复
热议问题