2010-01-04 3 views
2

Si j'ai une application comme ceci:HQL: Interrogation propriété composante dynamique

<class name="Library" table="Libraries"> 
    ... 
    <dynamic-component name="Annotations"> 
    <property name="LibraryResolver.AlgorithmVersion" column="`LibraryResolver.AlgorithmVersion`" type="Int32" /> 
    </dynamic-component> 
</class> 

Comment dois-je écrire HQL ou Linq-à-NHibernate requête pour toutes les bibliothèques où LibraryResolver.AlgorithmVersion est supérieure à une valeur donnée?

Répondre

1

Je ne sais pas si cela aide mais quand j'utilise l'API Criteria (en Java) cela fonctionne juste. N'a pas essayé avec HQL cependant.

<dynamic-component name="values"> 
     <property name="dynamicNameValue" column="ATTRIBUTE_1" type="string"/> 
     <property name="dynamicNumber" column="ATTRIBUTE_4" type="integer"/> 
</dynamic-component> 

Criteria criteria = session.createCriteria(DynamicAttributes.class) 
       .add(Expression.eq("values.dynamicNumber", 2)); 

Juste une pensée: pourrait-il que le problème est que le nom (« LibraryResolver.AlgorithmVersion ») vous passez contient un point? Peut-être poster un code que vous avez déjà essayé?

+0

Ok, je vais poster le code un peu plus tard, mais je peux déjà dire que vous êtes tout à fait correct à propos du nom. Aucune idée de comment échapper ou utiliser dans ce cas. L'API Criteria fonctionne, mais cette requête est issue d'une bibliothèque qui ne lient même pas à NHibernate, et je voudrais laisser cela comme ça. –

2

La requête HQL ci-dessous peut-être le long des lignes que vous recherchez

from Library as lib 
where lib.Annotations.LibraryResolver.AlgorithmVersion > 2 

Si vous utilisez NHibernate, vous avez essayé le NHibernate LambdaExtensions? Cette bibliothèque fournit un ensemble de méthodes d'extensions sur les API Criteria et DetachedCriteria qui supprime le besoin de chaînes magiques lors d'une requête en utilisant les deux API ci-dessus.

Ci-dessous un exemple de la façon dont on peut utiliser NHibernate requête Criteria indépendante avec la bibliothèque LambdaExtensions mentionné

Answer answerAlias = null; 
var actual = DetachedCriteria.For<Survey>() 
.Add<Survey>(s => s.Status == SurveyStatus.Complete) 
.Add<Questionnaire>(q => q.Id == questionnaireId) 
.CreateAlias<Survey>(s => s.Answers,() => answerAlias) 
.SetProjection(LambdaProjection.Property(() => answerAlias.Id)); 
+0

Ça marche? Je suis certain que j'ai essayé une requête similaire et supposé que AlgorithmVersion est une sous-propriété. Malheureusement. NET dans mon système s'est corrompu ce qui m'empêche d'essayer ceci dans l'heure restante jusqu'à l'approbation. Les extensions lambda semblent intéressantes. J'ai essayé Linq-to-Nhibernate et il n'a pas réussi à créer une requête raisonnable, cependant les extensions semblent fournir une approche plus directe pour construire des requêtes. D'un autre côté, je ne veux toujours pas faire référence à NH de Domain Services. –

+0

Personnellement, j'ai tous deux utilisé HQL et Critères/critères détachés. Je vous recommande d'essayer les extensions Lambda. Cela m'a vraiment aidé à progresser plus rapidement sur l'API des critères. Pour savoir où l'instruction HQL fonctionnerait ou non, ce serait quelque chose que vous devrez essayer. Mais je suis sûr que ce sera un bon point de départ pour commencer :) – Noel

Questions connexes