【问题标题】:Hibernate NativeQuery setParameter doesn't work when getting a list of tables获取表列表时,Hibernate NativeQuery setParameter 不起作用
【发布时间】:2020-04-23 07:08:33
【问题描述】:

我正在尝试从 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 得到的错误是:

错误:您的 SQL 语法有错误;检查手册 对应于您的 MySQL 服务器版本,以便使用正确的语法 1号线''sakila''附近

如果我将查询与 "show tables from " + dbName; 之类的 dbName 连接起来,我可以让它工作,但如果我设置参数,它就不起作用。

【问题讨论】:

  • 不能对数据库对象使用参数,例如表名。

标签: java mysql hibernate nativequery


【解决方案1】:

您不能将参数用于数据库对象,例如表名。您的 SQL 数据库的prepared statement 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 语句。

【讨论】:

    猜你喜欢
    • 2014-08-17
    • 2021-06-23
    • 1970-01-01
    • 2021-11-04
    • 1970-01-01
    • 2019-01-02
    • 2014-04-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多