【问题标题】:Set list parameter to native query将列表参数设置为本机查询
【发布时间】:2013-09-13 03:52:12
【问题描述】:

我想将参数设置为原生查询,

javax.persistence.EntityManager.createNativeQuery

类似的东西

Query query = em.createNativeQuery("SELECT * FROM TABLE_A a WHERE a.name IN ?");
List<String> paramList = new ArrayList<String>();
paramList.add("firstValue");
paramList.add("secondValue");
query.setParameter(1, paramList);

在异常中尝试此查询结果:

Caused by: org.eclipse.persistence.exceptions.DatabaseException:
Internal Exception: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException:
You have  an error in your SQL syntax; check the manual that corresponds to your MySQL server 
version for the right syntax to use near
'_binary'??\0♣sr\0‼java.util.ArrayListx??↔??a?♥\0☺I\0♦sizexp\0\0\0☻w♦\0\0\0t\0
f' at line 1
Error Code: 1064
Call: SELECT * FROM Client a WHERE a.name IN ?
        bind => [[firstValue, secondValue]]
Query: ReadAllQuery(referenceClass=TABLE_A sql="SELECT * FROM TABLE_A a WHERE a.name IN ?")

有没有办法为原生查询设置列表参数,而不是强制转换为字符串并将其附加到sql查询?

附:我正在使用 EclipseLink 2.5.0 和 MySQL 服务器 5.6.13

谢谢

【问题讨论】:

    标签: java sql jpa nativequery


    【解决方案1】:

    我相信您只能将列表参数设置为 JPQL 查询,而不是原生查询。

    要么使用 JPQL,要么使用列表动态构造 SQL。

    【讨论】:

    • 动态意味着我必须使用相同数量的参数和 paramList.size() 构造我的查询?
    • 希望看到一些引用这个答案而不是“我相信”
    【解决方案2】:

    如果你命名参数,它会起作用:

    Query query = em.createNativeQuery("SELECT * FROM TABLE_A a WHERE a.name IN (:names)");
    List<String> paramList = new ArrayList<String>();
    paramList.add("firstValue");
    paramList.add("secondValue");
    query.setParameter("names", paramList);
    

    【讨论】:

    • 它永远在 Hibernate 中工作,但在提出问题时,它在 EclipseLink 中不起作用(问题是关于),我相当肯定它仍然没有。
    【解决方案3】:

    不是解决方案,而是更多的解决方法。

     Query query = em.createNativeQuery("SELECT * FROM TABLE_A a WHERE a.name IN ?");
        List<String> paramList = new ArrayList<String>();
        String queryParams = null;
        paramList.add("firstValue");
        paramList.add("secondValue");
        query.setParameter(1, paramList);
    
        Iterator<String> iter = paramList.iterator();
    int i =0;
    
    while(iter.hasNext(){
        if(i != paramList.size()){
    
        queryParams = queryParams+ iter.next() + ","; 
    
        }else{
    
        queryParams = queryParams+ iter.next();
    
       }
       i++;
    }
    
    query.setParameter(1, queryParams );
    

    【讨论】:

    • 虽然这段代码可能有助于解决问题,但它并没有解释为什么和/或如何回答这个问题。提供这种额外的背景将显着提高其长期价值。请编辑您的答案以添加解释,包括适用的限制和假设。
    猜你喜欢
    • 2012-08-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-28
    • 2023-03-29
    • 1970-01-01
    • 2013-06-10
    • 1970-01-01
    相关资源
    最近更新 更多