1

假设我们有 HQL 查询:

String ageQuery = "select age from people where name = :name";

Session session = getSession();
Query query = session.
        createSQLQuery(nameQuery).
        setParameter("name", "Thomas");
// query.list(); returns the result

但是如果我想参数化表名怎么办?不能这样使用它:

String ageQuery = "select :table from people where name = :name";

Session session = getSession();
Query query = session.
        createSQLQuery(ageQuery).
        setParameter("table", "age").
        setParameter("name", "Thomas");

我已经应用了解决方法:

String ageQuery = "select :table: from people where name = :name";

Session session = getSession();
Query query = session.
        createSQLQuery(ageQuery.
        replace(":table:", "age")).
        setParameter("name", "Thomas");

......但我真的不喜欢它。还有其他解决方案吗?

4

2 回答 2

4

您不能将表名定义为参数;您必须以老式方式使用字符串连接构建语句。
您的解决方法不是解决方法,而是继续进行的唯一方法。
是一个类似于“@P0”附近的不正确语法中描述的问题。在 MSSQL 中创建和删除登录时出现异常

于 2013-09-02T18:30:00.880 回答
1

我在下面使用动态查询:

var query = session.CreateQuery(String.Format("update {0} set {1} = :updatevalue where {2} = :wherevalue",
    MyClassMapping<UserEntity>.GetEntityName(),
    MyClassMapping<UserEntity>.GetPropertyName(x => x.LastLoginTime),
    MyClassMapping<UserEntity>.GetPropertyName(x => x.UserKey)))
    .SetParameter("updatevalue", DateTime.Now)
    .SetParameter("wherevalue", user.UserKey);
int rowsAffected = query.ExecuteUpdate();
于 2014-11-25T19:50:00.820 回答