0

以下代码有什么问题?

public IList<T> GetPostsByUser(object UserId)
    {
        using (var session = sessionFactory.OpenSession())
        {
            using (var transaction = session.BeginTransaction())
            {
                var queryString = string.Format("SELECT C FROM {0} AS C WHERE UserId=:UserId", typeof(T));
                return session.CreateSQLQuery(queryString).SetParameter("UserId", UserId).List<T>();
                //return session.QueryOver<T>().List<T>().IsLike(UserId).List();
            }
        }
    }

注意:UserId被强制转换为对象,但它的来源来自System.GUID

例外:

无法执行查询 [SELECT C FROM FNHRepository.Entites.Post AS C WHERE UserId=@p0] Name:UserId - Value:3010cd36-539c-4b32-a0fb-976bca58ad38 [SQL: SELECT C FROM FNHRepository.Entites.Post AS C WHERE用户 ID=@p0]

4

1 回答 1

0

注意我明确地说参数将是 String 类型,这将确保 Nhibernate 将字符串包装在单引号 ( '') 中,这是查询所期望的。如果您想使用 SetParameter 那么您的查询需要设置单引号,即您的查询应该是

string.Format("SELECT C FROM {0} AS C WHERE UserId=':UserId'", typeof(T));

因此使用这个:

var queryString = string.Format("SELECT C FROM {0} AS C WHERE UserId=:UserId", typeof(T)); // you can use SetGuid too, which will again wrap it with quotes
return session.CreateSQLQuery(queryString).SetString("UserId", UserId).List<T>();

或者

var queryString = string.Format("SELECT C FROM {0} AS C WHERE UserId=':UserId'", typeof(T));
return session.CreateSQLQuery(queryString).SetParameter("UserId", UserId).List<T>();

另外,我建议您使用typeof(T).Name而不是使用完全限定名称。

于 2012-06-25T07:11:13.867 回答