获取表列表时,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 语句。