12
votes

NHibernate: Createcriteria et existent la clause

Comment puis-je écrire le SQL suivant à l'aide de Createciteria: xxx


0 commentaires

3 Réponses :


28
votes

Voici comment vous pouvez le faire:

DetachedCriteria dCriteria = DetachedCriteria.For<Baz>("baz")
        .SetProjection(Projections.Property("baz.FooBarId"))
        .Add(Restrictions.EqProperty("baz.FooBarId", "fooBar.Id"));

var fooBars = Session.CreateCriteria<FooBar>("fooBar")
        .Add(Subqueries.Exists(dCriteria)).List<FooBar>();


1 commentaires

Cela m'a aidé à résoudre l'erreur NHibernate: "Impossible de trouver un fournisseur d'informations de critère correspondant à", merci pour le simple exemple.



3
votes

J'ai travaillé sur la façon de faire cela en utilisant l'expression islamoPty. Ici, il utilise Nhibernate Lambda Extensions:

Session.CreateCriteria<FooBar>()
    .Add(SqlExpression.IsNotEmpty<FooBar>(x => x.Bazes))
    .List<FooBar>();


1 commentaires

En effet ... et vous m'avez donné l'idée que cela puisse être fait de manière plus simple et sans les extensions de NHibernate Lambda. J'ai édité ma réponse pour inclure cette option.



5
votes

Avoir juste résolu un problème connexe et finalement arrivé à une solution, je pensais partager la réponse ici:

En supposant que vous souhaitiez la requête de questions d'origine, avec une condition supplémentaire sur la sous-requête: xxx

supposant que vous avez une référence sur la classe BAZ au parent, appelez FOOBARREF [dans la classe de carte fluide que vous utiliseriez la méthode des références], vous créeriez la requête en tant que suit: xxx

Je ne suis pas 100% convaincu de codage dur de l'alias "Ceci", qui est l'alias NHibernate attribue automatiquement à l'entité racine (table) dans le Requête, mais c'est la seule façon de référencer la clé de la table de la requête mère à partir de la sous-requête.


0 commentaires