Java 查询数据库时,将列表转换为逗号分隔字符串以传入SQL的最佳方法是什么?

Java 查询数据库时,将列表转换为逗号分隔字符串以传入SQL的最佳方法是什么?,java,sql,hibernate,jpa,java-8,Java,Sql,Hibernate,Jpa,Java 8,我有一个ID列表 1, 2, 3, 4 我想写一个删除查询 public void deleteComputersUsingNative(List<Integer> id) { String commaSeperated = ?//Convert ID to comma seperated string in to put in where clause em.createNativeQuery("DELETE FROM PD_OWNER.CIM_SNOW_COM

我有一个ID列表

1, 2, 3, 4
我想写一个删除查询

public void deleteComputersUsingNative(List<Integer> id) {
    String commaSeperated = ?//Convert ID to  comma seperated string in to put in where clause
    em.createNativeQuery("DELETE FROM PD_OWNER.CIM_SNOW_COMP_OPTDRIV_TAB WHERE ID IN (" +commaSeperated +")").executeUpdate();
}
public void deleteComputersUsingNative(列表id){
String CommaseOperated=?//将ID转换为逗号分隔的字符串in to put in where子句
em.createNativeQuery(“从PD_OWNER.CIM_SNOW_COMP_OPTDRIV_选项卡中删除,其中ID位于(“+CommaseOperated+”))。executeUpdate();
}
要执行
toString()
,请在一个解决方案中删除括号


在普通java或jpa/hibernate中有没有更好的方法来处理这个问题?

您可以使用
String.join

String.join(',', id)

尽管您可以在
unwrap
之后使用
setParameterList
方法将列表传递给hibernate的
查询
,这将是正确的处理方法。有关详细信息,请参阅。

您可以使用
字符串。加入

String.join(',', id)

尽管您可以在
unwrap
之后使用
setParameterList
方法将列表传递给hibernate的
查询
,这将是正确的处理方法。有关更多详细信息,请参阅。

这些问题有两种不同的答案:

  • 将列表连接成逗号分隔字符串的最佳方法是apache commons中的
    StringUtils.join(List,delimiter)
    (其次是
    String.join(delimiter,List)
  • 向查询中添加参数列表的最佳方法是
    query.setParameter(“id”,list)
    ,但我认为,为此,您必须从查询中删除parentesise

这些问题有两种不同的答案:

  • 将列表连接成逗号分隔字符串的最佳方法是apache commons中的
    StringUtils.join(List,delimiter)
    (其次是
    String.join(delimiter,List)
  • 向查询中添加参数列表的最佳方法是
    query.setParameter(“id”,list)
    ,但我认为,为此,您必须从查询中删除parentesise


我无法在createNativeQuery中找到setParameterList。。。我赞成使用预先准备好的语句并绑定集合。这种方法应该只考虑整数,而不考虑字符串。@TimBiegeleisen因此我的注释。我编辑它是为了强调这一点。谢谢,谢谢。我有hibernate,需要在单个方法中删除所有记录以及一些记录,所以这里需要本机查询。删除某些记录可以是1100或5000。所以使用这种方法。需要看看@NamedNativeRequesty是否也能帮上忙,因为我记得在我们传递集合的命名查询中。我无法在createNativeQuery中找到setParameterList。。。我赞成使用预先准备好的语句并绑定集合。这种方法应该只考虑整数,而不考虑字符串。@TimBiegeleisen因此我的注释。我编辑它是为了强调这一点。谢谢,谢谢。我有hibernate,需要在单个方法中删除所有记录以及一些记录,所以这里需要本机查询。删除某些记录可以是1100或5000。所以使用这种方法。需要看看@namedNaviRequesty是否也能像我记得的那样在我们传递集合的命名查询中有所帮助。。。。在这种方法中,查询应该是什么样的。。。id在哪里?如果没有参数呢?我强烈反对SQL连接,这是一个严重的安全风险。您应该使用参数绑定。我拒绝协助创建安全漏洞,因此没有关于“无参数”的建议…好的。安全风险是什么?只是为了了解我有没有参数。。。。在这种方法中,查询应该是什么样的。。。id在哪里?如果没有参数呢?我强烈反对SQL连接,这是一个严重的安全风险。您应该使用参数绑定。我拒绝协助创建安全漏洞,因此没有关于“无参数”的建议…好的。安全风险是什么?只是为了知识