bueno.... Creo que *yo* la ultima opción para hacer consultas ni la intentaría! :P
El 12 de octubre de 2009 21:08, José F. Romaniello <[email protected]>escribió: > Roberto, yo trataría de hacerlo con Criteria. Ya que justamente para el > caso que mencionas es mas recomendado usar criteria, en vez de construir la > query dinamicamente. > > http://groups.google.com/group/nhibernate-hispano/browse_thread/thread/2ca46eefac311517/fbae60c68ca0f7fa?lnk=gst&q=hql+criteria#fbae60c68ca0f7fa > > Recuerda que en nhibernate hay para elegir formas de hacer una consulta: > http://fabiomaulo.blogspot.com/2009/09/nhibernate-queries.html > > > El 12 de octubre de 2009 18:10, roberto <[email protected]>escribió: > > >> 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 -~----------~----~----~----~------~----~------~--~---
