2010-09-18 5 views
0

J'essaie d'appeler une fonction de base de données de HQL. La déclaration HQL doit simplement appeler la fonction et retourner sa valeur, comme celui-ciInstructions HQL sans clause FROM et WHERE

select someFunction(:someParameter) 

Si je tente d'appeler sélectionner current_timestamp().

Il échoue avec

NHibernate.Hql.Ast.ANTLR.QuerySyntaxException: Exception de type 'Antlr.Runtime.MismatchedTreeNodeException' a été levée. près de la ligne 1, colonne 24 [select current_timestamp()]

Je sais qu'il n'y a pas beaucoup de raisons de récupérer l'horodatage actuel. Mais j'ai créé quelques fonctions de base de données définies par l'utilisateur que je voudrais tester à l'unité en les appelant depuis HQL.

Il me semble qu'il n'est pas possible d'écrire une instruction HQL sans clause FROM et WHERE. Cela peut-il être vrai?

IQuery query = unitOfWork.Session.CreateQuery("select current_timestamp()"); 

var ts = query.UniqueResult();

Répondre

0
  1. Cela n'a pas beaucoup de sens d'appeler une telle fonction. Soit vous avez une procédure stockée qui doit être appelée en utilisant d'autres méthodes, soit vous avez une fonction qui n'est pas du tout liée à la base de données, et qui ne devrait donc pas être exécutée via la base de données pour commencer.

  2. Dans tous les cas, si la fonction ne fonctionne pas sur un ensemble de lignes, ne pouvez-vous pas simplement ajouter une clause DUmmy FROM, par exemple sur une petite table statique?

+0

1. Je suis d'accord. Je ne fais que pour tester les fonctions. –

+0

2. Je pourrais ajouter une clause DUmmy FROM. L'inconvénient est que le test dépend alors d'une cartographie d'entité fictive. –

2

Cela pourrait fonctionner si vous faites explicitement une requête SQL, pas une requête HQL:

var query = unitOfWork.Session.CreateSQLQuery("select current_timestamp()");