Bueno, pues muchas gracias... hasta ahora pude resolver mi problema, mientras analizo otras opciones de la siguiente manera, aunque la verdad no estoy muy convencido: conociendo la instancia de mi entidad pude leer el metadata del mapping a través de GetClassMetadata() y simplemente hice una exclusión a todos aquellas propiedades que fueran diferentes a "NHibernate.Type.ComponentType" solución demasiado rústica =(
Saludos... On 9 oct, 15:22, Fabio Maulo <[email protected]> wrote: > Bueno... ahora estas usando el parser viejo que puede tener comportamientos > distintos respecto a lo de 1.2.1.Lo que "lamentablemente" te queda es sacar > ese "left join fetch"... > Aprovecho para aclarar algo: > Hay varios casos, y no son pocos, donde un "left join fetch" o un "join > fetch" tiene menores prestaciones de un nuevo round-trip con una select. > Eso de poner algo que contruya HQL, con string concatenation, que le pone > un "left join fetch", así de forma general sin importar el caso de uso > especifico y solo porque hay una relación, no es tan buena idea. Desde > NH2.0.0 se puede usar MultiQuery para levantar todas las asociaciones de un > solo round-trip en lugar de usar "join fetch". > > Mas que esto me parece que no puedo... por lo menos en la lista... > conociendo el caso especifico sería distinto. > > El 9 de octubre de 2009 18:35, roberto <[email protected]> escribió: > > > > > > > > > Voy de nuevo... intente cortar la cabeza al toro, pero algo raro me > > sucedio. Muestro mi configuración: > > > cfg = new NHibernate.Cfg.Configuration(); > > cfg.Properties.Add(NHibernate.Cfg.Environment.ConnectionProvider, > > "NHibernate.Connection.DriverConnectionProvider"); > > cfg.Properties.Add > > (NHibernate.Cfg.Environment.CurrentSessionContextClass, "web"); > > cfg.Properties.Add(NHibernate.Cfg.Environment.ConnectionDriver, > > "NHibernate.Driver.SqlClientDriver"); > > cfg.Properties.Add(NHibernate.Cfg.Environment.Dialect, > > "NHibernate.Dialect.MsSql2008Dialect"); > > cfg.Properties.Add(NHibernate.Cfg.Environment.MaxFetchDepth, "-1"); > > cfg.Properties.Add > > (NHibernate.Cfg.Environment.ProxyFactoryFactoryClass, > > "NHibernate.ByteCode.Castle.ProxyFactoryFactory, > > NHibernate.ByteCode.Castle"); > > cfg.Properties.Add(NHibernate.Cfg.Environment.UseSecondLevelCache, > > "false"); > > cfg.Properties.Add(NHibernate.Cfg.Environment.UseQueryCache, "false"); > > cfg.Properties.Add(NHibernate.Cfg.Environment.ShowSql, "false"); > > cfg.Properties.Add(NHibernate.Cfg.Environment.BatchSize, "16"); > > cfg.Properties.Add(NHibernate.Cfg.Environment.DefaultSchema, "dbo"); > > cfg.Properties.Add(NHibernate.Cfg.Environment.GenerateStatistics, > > "true"); > > > cfg.Properties.Add(NHibernate.Cfg.Environment.QueryTranslator, > > "NHibernate.Hql.Classic.ClassicQueryTranslatorFactory, NHibernate "); > > > Ahora en "teoria" realiza correcto el parseo, y aunque ya no me > > devuelve una excepción el hql si me arroja un array vacio... > > > Algo estaré haciendo mal? estoy usando la variable de forma correcta? > > > Saludos, y gracias por la ayuda. > > > On 9 oct, 13:05, roberto <[email protected]> wrote: > > > Perfecto... analizo las dos opciones que me dá... muchas gracias, me > > > quedo ya mas tranquilo =) > > > > Saludos... > > > > On 9 oct, 13:02, Fabio Maulo <[email protected]> wrote: > > > > > ah otra cosa...Si queres cortar la cabeza al toro es suficiente con > > esto: > > > > <property name ="query.factory_class"> > > > > NHibernate.Hql.Classic.ClassicQueryTranslatorFactory, NHibernate > > > > </property> > > > > > El 9 de octubre de 2009 17:01, Fabio Maulo <[email protected]> > > escribió: > > > > > > no tiene sentido "left join fetch obj.InformacionGenerica".Si generas > > las > > > > > HQL a run-time deberias hacer lo mismo que hace NH generando SQL. > > > > > Cuando escribis "obj.InformacionGenerica.CodigoPersona.Clave" NH se > > da > > > > > cuenta y se fija en los metadata para conocer las relaciones, con eso > > > > > construye los joins necesarios para llegar a la propiedad "Clave" que > > está > > > > > tres niveles mas abajo. > > > > > > Si queres generar HQL dinamicas deberías hacer lo mismo o, even > > better, > > > > > generar Criteria y no HQL. > > > > > > El 9 de octubre de 2009 16:56, roberto <[email protected]> > > escribió: > > > > > >> Si entiendo el punto, una vez que contamos con la información del > > > > >> component en la misma tabla... en otro órden de ideas, ¿lo que me > > > > >> intenta decir es que esta nueva versión lo identifica como error? > > > > > >> Yo lo hago asi debido a que al hql que esta viendo se crea en > > runtime, > > > > >> identifica la propiedad InformacionGenerica en la clase como objeto > > > > >> (aunque en el mapping nosotros sabemos que es un Component) y > > > > >> agregandolo a la clausula from como nested object... > > > > > >> Pedí ayuda debido a que en la versión 1.2 de NH me permitia > > hacerlo... > > > > >> =) > > > > > >> On 9 oct, 12:49, Fabio Maulo <[email protected]> wrote: > > > > >> > preguta...Que sentido tiene un "left join" o un "join" con un > > component > > > > >> ? > > > > > >> > El 9 de octubre de 2009 16:06, roberto <[email protected]> > > > > >> escribió: > > > > > >> > > Hola a todos... > > > > > >> > > Me preguntaba si alguno de ustedes se habia topado con el > > siguiente > > > > >> > > error: > > > > > >> > > Justo acabo de migrar de la versión 1.2 a 2.1 de NH y dentro de > > todo > > > > >> > > funciono bien, excepto por un hql query el cual involucra un > > Component > > > > >> > > en el mapping... > > > > > >> > > Agrego mi mapping: > > > > > >> > > <?xml version="1.0" encoding="utf-8" ?> > > > > >> > > <hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"> > > > > >> > > <class name="Core.Moneda, Core" table="tblMonedas" > > lazy="false"> > > > > >> > > <id name="Id" column="id" type="int" unsaved-value="0"> > > > > >> > > <generator class="identity" /> > > > > >> > > </id> > > > > >> > > <property name="Clave" column="clave" type="int" /> > > > > >> > > <property name="Nombre" column="nombre" type="string" /> > > > > >> > > <many-to-one name="TipoMoneda" column="tipoMoneda" > > > > >> > > class="Core.TipoMoneda, Core" cascade="none" /> > > > > >> > > <property name="GenSubCuenta" column="subCuenta" > > type="string" /> > > > > >> > > <component name="InformacionGenerica" > > > > >> > > class="Core.InformacionGenerica, Core"> > > > > >> > > <property name="Alta" column="alta" /> > > > > >> > > <property name="Cambio" column="cambio" /> > > > > >> > > <property name="Baja" column="baja" /> > > > > >> > > <property name="Comentario" column="comentarios" /> > > > > >> > > <many-to-one name="CodigoPersona" class="Core.Usuario, > > Core" > > > > >> > > column="codigoUsuario" /> > > > > >> > > </component> > > > > >> > > </class> > > > > > >> > > Mi HQL: > > > > > >> > > select obj from Moneda as obj left join fetch obj.TipoMoneda > > left join > > > > >> > > fetch obj.InformacionGenerica where obj.Clave like 'pesos' or > > > > >> > > obj.Nombre like '%pesos%' or obj.TipoMoneda.Nombre like > > '%pesos%' or > > > > >> > > obj.GenSubCuenta like '%pesos%' or > > obj.InformacionGenerica.Comentario > > > > >> > > like '%pesos%' or obj.InformacionGenerica.Alta like '%pesos%' or > > > > >> > > obj.InformacionGenerica.Cambio like '%pesos%' or > > > > >> > > obj.InformacionGenerica.Baja like '%pesos%' or > > > > >> > > obj.InformacionGenerica.CodigoPersona.Clave like 'pesos' or > > > > >> > > obj.InformacionGenerica.CodigoPersona.Nombre like '%pesos%' > > > > > >> > > Finalmente la excepción: > > > > > >> > > en NHibernate.Hql.Ast.ANTLR.HqlSqlWalker.CreateFromJoinElement > > > > >> > > (IASTNode path, IASTNode alias, Int32 joinType, IASTNode > > fetchNode, > > > > >> > > IASTNode propertyFetch, IASTNode with) > > > > >> > > en NHibernate.Hql.Ast.ANTLR.HqlSqlWalker.joinElement() > > > > >> > > en NHibernate.Hql.Ast.ANTLR.HqlSqlWalker.fromElement() > > > > >> > > en NHibernate.Hql.Ast.ANTLR.HqlSqlWalker.fromElementList() > > > > >> > > en NHibernate.Hql.Ast.ANTLR.HqlSqlWalker.fromClause() > > > > >> > > en NHibernate.Hql.Ast.ANTLR.HqlSqlWalker.unionedQuery() > > > > >> > > en NHibernate.Hql.Ast.ANTLR.HqlSqlWalker.query() > > > > >> > > en NHibernate.Hql.Ast.ANTLR.HqlSqlWalker.selectStatement() > > > > >> > > en NHibernate.Hql.Ast.ANTLR.HqlSqlWalker.statement() > > > > >> > > en NHibernate.Hql.Ast.ANTLR.HqlSqlTranslator.Translate() > > > > >> > > en NHibernate.Hql.Ast.ANTLR.QueryTranslatorImpl.Analyze > > > > >> > > (HqlParseEngine parser, String collectionRole) > > > > >> > > en NHibernate.Hql.Ast.ANTLR.QueryTranslatorImpl.DoCompile > > > > >> > > (IDictionary`2 replacements, Boolean shallow, String > > collectionRole) > > > > >> > > en NHibernate.Hql.Ast.ANTLR.QueryTranslatorImpl.Compile > > > > >> > > (IDictionary`2 replacements, Boolean shallow) > > > > >> > > en NHibernate.Engine.Query.HQLQueryPlan..ctor(String hql, > > String > > > > >> > > collectionRole, Boolean shallow, IDictionary`2 enabledFilters, > > > > >> > > ISessionFactoryImplementor factory)... > > > > > >> > > Estuve leyendo un thead en los foros de Hibernate con el mismo > > > > >> > > problema: > > >http://opensource.atlassian.com/projects/hibernate/browse/HHH-1895?pa. > > > > >> .. > > > > >> > > pero comentan que es un unsupported feature, no se si para NH > > suceda > > > > >> > > lo mismo... > > > > > >> > > Agradezco mucho su ayuda... > > > > > >> > > Saludos desde México. > > > > > >> > -- > > > > >> > Fabio Maulo > > > > > > -- > > > > > Fabio Maulo > > > > > -- > > > > Fabio Maulo > > -- > Fabio Maulo --~--~---------~--~----~------------~-------~--~----~ Para escribir al Grupo, hágalo a esta dirección: [email protected] Para más, visite: http://groups.google.com/group/NHibernate-Hispano -~----------~----~----~----~------~----~------~--~---
