【问题标题】:passing object[] to sql query将 object[] 传递给 sql 查询
【发布时间】:2023-03-21 22:02:01
【问题描述】:

在我的应用程序中,我有类别 ID 列表。现在我想根据产品类别从数据库中获取产品,该产品类别将包含在该列表中,还有产品名称,如“XYZ”。如何通过使用 IN 子句来实现这一点. 有没有人知道我通过传递方式尝试过这个但我得到了空列表

我的代码是:

Object[] cids=final_cats.toArray();
String cds=final_cats.toString();
String query="select fpd from FTextProductDetails ftpd inner join ftpd.fProductDetails fpd WHERE fpd.categoryId in( "+cds+" )and ftpd.productName like ?" ;
Object[] values=new Object[]{'%'+productName+'%'};
List<Object[]> list=HibernatePaginationImpl.findProductsByName(query, values,pageSizeLimit , pageNumber,this.baseDao);

这里 final_cats 包含所有类别。

【问题讨论】:

  • 由于您似乎在使用 Hibernate,因此您可以使用 Hibernate Criteria Query (docs.jboss.org/hibernate/orm/3.3/reference/en/html/…) 并使用 Restrictions.in (docs.jboss.org/hibernate/orm/3.3/api/org/hibernate/criterion/…)
  • 谢谢大卫先生。在这里我编写了自定义类 HibernatePaginationImpl,它将具有接受查询的静态方法。所以我需要传递查询并限制使用条件。
  • 好的,如果您需要可以构建PreparedStatement 的SQL,那么您的SQL 中确实需要有很多? 标记。由于CuE已经给你一个使用该技术的答案,我不会打扰。我希望你设法完成这项工作。祝你好运。
  • 我已经回滚了您在标题中添加 [Colsed] 的编辑,因为 1)它是 Closed 的拼写错误,2)这不是您在 Stack Overflow 中表示已解决问题的方式:而是接受您的超时后自己的答案(或另一个答案)。

标签: java sql hibernate


【解决方案1】:

让 final_cats 成为一个列表

 int locSize = final_cats.size();
 StringBuilder builder = new StringBuilder();
 Object[] args = new Object[locSize];               
 for( int i = 0; i < locSize; i++ ) {
      builder.append(" ?, " );
      args[i]= final_cats.get(i);
 }
....
String queryString = StringUtils.substringBeforeLast(builder.toString(), ",");      
String query="select fpd from FTextProductDetails ftpd inner join ftpd.fProductDetails fpd WHERE fpd.categoryId in("+ builder.toString() +")and ftpd.productName like ?" ;

希望这个逻辑有所帮助..

【讨论】:

    【解决方案2】:

    我的问题得到了解决。

    代码如下:

    Object[] cids=final_cats.toArray();
    String cds="";
    for(Object o:cids) {
    
            cds=cds+o+",";
    }
    
    cds=cds.substring(0, cds.length()-1);
    
    String query="select fpd from FTextProductDetails ftpd inner join ftpd.fProductDetails fpd WHERE fpd.categoryId in( "+cds+")and ftpd.productName like ?" ;
    Object[] values=new Object[]{'%'+productName+'%'};
    List<Object[]> list = HibernatePaginationImpl.findProductsByName(query, values,pageSizeLimit , pageNumber,this.baseDao);
    

    【讨论】:

    • 您知道if(cds==null &amp;&amp; cds.isEmpty()) 永远不可能是真的吗?事实上,如果你不是在使用 Apache Commons,前十行可以写成一行 - String cds = StringUtils.join(final_cats, ','); 我觉得这更具可读性。我希望它有一些用处。
    猜你喜欢
    • 1970-01-01
    • 2018-05-29
    • 2019-02-16
    • 2013-08-02
    • 1970-01-01
    • 2015-04-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多