如何在JDBI中动态绑定表名

11

我尝试使用

SELECT COUNT(*) FROM :TableName;

我在JDBI中使用了

.bind("Tablename", "MyTable")

结果始终在单引号内:

SELECT COUNT(*) FROM 'MyTable';

有没有一种合适的方式来对像TableName这样的东西进行参数化?

2个回答

14

bind 并不是用于标识符而是用于值。 Table 是一个数据库对象,它的名称是用于引用它的标识符。

因此,您必须显式构造 SQL 查询字符串以动态包含表名。

示例

String tableName = "employee";
String sql = "SELECT COUNT(*) FROM " + tableName;

如果您想根据字段值或表达式来过滤计数或任何其他结果,您可以进行绑定。

示例

sql = sql + " WHERE deptno = :deptNoToBind";
int deptNo = 20;
// ... use db handle to bind
handle.createQuery( sql )
      .bind( "deptNoToBind", deptNo );

您可以看到列或表达式的值被绑定,但不是标识符。

您要查找的功能是 @Define - 这是它使用的示例:

import org.skife.jdbi.v2.sqlobject.customizers.Define;
...
@SqlUpdate("create table if not exists <table> (" +
        "startTime TimeStamp not null," +
        "stopTime TimeStamp not null," +
        "uuid varchar(255)" +
        ")")
public void createTable(@Define("table") String table);

4
@UnknownDownVoter:为什么要点踩,能具体说一下原因吗? - Ravinder Reddy
1
讨厌的人总是要讨厌,伙计。 ¬¬ - Miere
2
如果您在<table>中使用<*>语法,则需要使用@UseStringTemplate3StatementLocator注释接口,并为此注释将以下依赖项添加到您的pom中: <dependency> <groupId>org.antlr</groupId> <artifactId>stringtemplate</artifactId> <version>3.2</version> </dependency> - lecandas

5
import org.skife.jdbi.v2.sqlobject.customizers.Define;
import org.skife.jdbi.v2.sqlobject.stringtemplate.UseStringTemplate3StatementLocator;

@UseStringTemplate3StatementLocator
public interface CreateTableDAO {

    @SqlUpdate("create table if not exists <table> (" +
        "startTime TimeStamp not null," +
        "stopTime TimeStamp not null," +
        "uuid varchar(255)" +
        ")")
    public void createTable(@Define("table") String table);

}

不要忘记添加 UseStringTemplate3StatementLocator 注释的依赖项。
<dependency>
    <groupId>org.antlr</groupId>
    <artifactId>stringtemplate</artifactId>
    <version>3.2</version>
</dependency>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接