获取表列表时,Hibernate NativeQuery setParameter 不起作用
Hibernate NativeQuery setParameter doesn't work when getting a list of tables
我正在尝试从 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
如果我将查询与诸如 "show tables from " + dbName;
之类的 dbName 连接起来,我可以使它工作,但是如果我设置参数,它就不起作用。
您不能对 table 名称等数据库对象使用参数。您的 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));
}
}
这里的想法是只维护一个您希望来自外部的已知数据库的列表。然后,您只需将传入的数据库名称映射到 show tables 语句。
我正在尝试从 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
如果我将查询与诸如 "show tables from " + dbName;
之类的 dbName 连接起来,我可以使它工作,但是如果我设置参数,它就不起作用。
您不能对 table 名称等数据库对象使用参数。您的 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));
}
}
这里的想法是只维护一个您希望来自外部的已知数据库的列表。然后,您只需将传入的数据库名称映射到 show tables 语句。