gpt4 book ai didi

java - 获取表列表时 Hibernate NativeQuery setParameter 不起作用

转载 作者:行者123 更新时间:2023-11-29 09:26:02 27 4
gpt4 key购买 nike

我正在尝试从 MySQL 数据库获取表的 ArrayList。从我读过的文章来看,以下代码应该可以工作,但事实并非如此。

private ArrayList<String> makeTableArray(String dbName){
ArrayList<String> stringArr = new ArrayList<>();
try(Session session = ServerConnect.getSessionFactory().openSession()){
String query = "show tables from :dbName";
NativeQuery nativeQuery = session.createNativeQuery(query);
nativeQuery.setParameter("dbName", dbName);
List list = nativeQuery.list();

for(Object database: list){
stringArr.add(String.valueOf(database));
}
}
return stringArr;
}

我使用数据库 sakila 时遇到的错误是:

ERROR: 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 ''sakila'' at line 1

如果我将查询与 dbName 连接起来,例如 "show table from "+ dbName;,我就可以得到这个工作,但如果我设置参数,它就不起作用。

最佳答案

您不能使用数据库对象的参数,例如表名。您的 SQL 数据库的预准备语句 API 不支持它,如果支持,则会造成重大漏洞。这是一种可能的解决方法,使用 switch 语句:

ArrayList<String> stringArr = new ArrayList<>();
try (Session session = ServerConnect.getSessionFactory().openSession()) {
String query = "";
switch (dbName) {
case "sakila":
query = "SHOW TABLES FROM sakila";
break;

case "foo":
query = "SHOW TABLES FROM foo";
break;

// other database names go here
}

NativeQuery nativeQuery = session.createNativeQuery(query);
nativeQuery.setParameter("dbName", dbName);
List list = nativeQuery.list();

for(Object database: list){
stringArr.add(String.valueOf(database));
}
}

这里的想法是只维护一个您期望来自外部的已知数据库的列表。然后,您只需将传入的数据库名称映射到显示表语句即可。

关于java - 获取表列表时 Hibernate NativeQuery setParameter 不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59600256/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com