以下代码有什么问题?
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] 名称:UserId - 价值:3010cd36-539c-4b32-a0fb-976bca58ad38 [SQL:SELECT C FROM FNHRepository.Entites.Post AS C WHERE UserId = @ p0]
答案 0 :(得分: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
而不是使用完全限定名称。