Fluent hibernate - generatedby queryresult?

本文关键字:queryresult generatedby hibernate Fluent | 更新日期: 2023-09-27 18:27:40

通常我们在Hibernate中使用c#(流畅的Hibernate)ID.(x=>x.Column).Generatedby.Sequence("blabla")

是否可以制作类似"由查询生成"的内容?我的意思是,我可以指定查询或存储过程来获得序列中的结果?

我需要这样做是因为:

我的IDvarchar。当我用"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();
                }
            }
        }

有什么想法吗?

Fluent hibernate - generatedby queryresult?

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");
        }
    }
}