通常我们在Hibernate中使用c#(流利的休眠)ID.(x=>x.Column).Generatedby.Sequence("blabla")
;
可以制作“由查询生成”之类的内容吗?我的意思是我可以指定查询或存储过程来获得序列中的结果吗?
我需要这样做,因为:
我的ID
是varchar
。当我按"generatedby.sequence("sequence"); "
生成时,我收到有关整数类型的错误,这当然是正确的。
所以我写了一个函数来解决这个问题。我将ID值的过程设为varchar (xxx0001,xxxx0002.......)
自动递增。这工作得很好。
现在我需要将(函数的)结果分配给映射类中的ID。
有办法吗?把结果
"SELECT GenerateSequencesAccountsr('SEQ_TEST',1) AS NextValue FROM dual"
我的“Id(x => x.account)????。
我在想一个可能的解决方案,在插入之前调用查询,但我试图保持我的“基础”完全通用。像:
public virtual void SaveData(object cls)
{
using (var session = SessionFactory.OpenSession())
{
using (var tx = session.BeginTransaction())
{
session.SaveOrUpdate(cls);
tx.Commit();
}
}
}
有什么想法吗?
答案 0 :(得分:0)
class MyCustomSqlGenerator : IPersistentIdentifierGenerator
{
private SqlString _sql = new SqlString("your select here");
public string GeneratorKey()
{
return _sql.ToString();
}
public string[] SqlCreateStrings(Dialect dialect)
{
// TODO: return sql Create of sqlfunction
}
public string[] SqlDropString(Dialect dialect)
{
// TODO: return sql DROP of sqlfunction
}
public object Generate(ISessionImplementor session, object obj)
{
try
{
IDbCommand cmd = session.Batcher.PrepareCommand(CommandType.Text, _sql, SqlTypeFactory.NoTypes);
IDataReader reader = null;
try
{
reader = session.Batcher.ExecuteReader(cmd);
try
{
reader.Read();
object result = IdentifierGeneratorFactory.Get(reader, NHibernateUtil.String, session);
return result;
}
finally
{
reader.Close();
}
}
finally
{
session.Batcher.CloseCommand(cmd, reader);
}
}
catch (DbException sqle)
{
throw ADOExceptionHelper.Convert(session.Factory.SQLExceptionConverter, sqle, "could not get next sequence value");
}
}
}