NHibernate - le moyen le plus simple de faire une recherche LIKE sur une colonne d’entier avec l’API des critères?

StackOverflow https://stackoverflow.com/questions/1231054

  •  22-07-2019
  •  | 
  •  

Question

J'essaie de faire une recherche similaire contre une colonne entière. Ce que je dois faire, c'est de convertir la colonne en varchar, puis de faire une recherche similaire. Est-ce possible? Quel est le moyen le plus simple de le faire à l'aide de l'API Criteria?

var search = "123";
criteria.Add(Restrictions.Like("Number", "%" + search + "%"))
Était-ce utile?

La solution

Si Number était une chaîne, ce serait facile:

.Add(Restrictions.Like("Number", "some_value",MatchMode.Anywhere))

Puisque vous avez un numéro, NHibernate en vérifiera le type et si vous lui donnez une chaîne, il lève une exception.

Je ne sais pas pourquoi l'équipe NH n'a pas fourni de surcharge avec un objet comme paramètre et un paramètre MatchMode ....

Quoi qu'il en soit, vous pouvez toujours le faire comme ceci:

.Add(Expression.Sql("{alias}.Number like ?", "%2%", NHibernateUtil.String))

Modifier

À propos de l'alias:

(Je ne trouve pas où la documentation en parle, mais voici ce que j'ai compris)

{alias} renvoie l'alias utilisé par NH pour les CreateCriteria les plus récents. Donc, si vous aviez:

session.CreateCriteria<User>("firstAlias")
       .CreateCriteria("firstAlias.Document", "doc")
       .Add(Expression.Sql("{alias}.Number like ?", "%2%",  
                           NHibernateUtil.String)).List<User>();

{alias} dans ce cas serait 'doc' - vous obtiendrez donc: doc.Number.

Donc, utilisez toujours {alias} après les CreateCriteria dont vous devez utiliser l'alias.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top