Bonjour,
je trouve un problème à appeler une fonction avec JPA.
je travaille avec une base de donnée Mysql, j'ai créé la fonction bonjour, qui prend en paramètre une chaine de caracteres (nom), et retourne une autre ('bonjour' + nom + '!') :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
 
DELIMITER $$
 
DROP FUNCTION IF EXISTS `bonjour` $$
CREATE DEFINER=`root`@`localhost` FUNCTION `bonjour`(s CHAR(20)) RETURNS char(50) CHARSET latin1
RETURN CONCAT('Bonjour, ',s,'!') $$
 
DELIMITER ;
le code java que j'utilise pour l'appeler (d'ailleurs ce que j'ai trouvé sur internet) est :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
 
EntityManager em = JpaUtil.getEntityManager();
		Query q = em.createNamedQuery("{call bonjour(:nom)}");
		q.setParameter("nom", "JPA");
		String r = (String)q.getSingleResult();
		System.out.print(r);
mais il produit l'exception suivante :
Exception in thread "main" java.lang.IllegalArgumentException: NamedQuery of name: {call bonjour(:nom)} not found.
at org.eclipse.persistence.internal.jpa.EJBQueryImpl.getDatabaseQueryInternal(EJBQueryImpl.java:571)
at org.eclipse.persistence.internal.jpa.EntityManagerImpl.createNamedQuery(EntityManagerImpl.java:1001)
at com.tuto.jpa.test.TestJpa.main(TestJpa.java:16)
j'ai essayé aussi :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
		Query q = em.createQuery("select bonjour(:nom) from dual");
mais toujours des exceptions :
Exception in thread "main" java.lang.IllegalArgumentException: An exception occurred while creating a query in EntityManager:
Exception Description: Syntax error parsing the query [select bonjour(:nom) from dual], line 1, column 14: syntax error at [(].
Internal Exception: MismatchedTokenException(83!=33)
at org.eclipse.persistence.internal.jpa.EntityManagerImpl.createQuery(EntityManagerImpl.java:1375)
at com.tuto.jpa.test.TestJpa.main(TestJpa.java:16)
Caused by: Exception [EclipseLink-8024] (Eclipse Persistence Services - 2.1.2.v20101206-r8635): org.eclipse.persistence.exceptions.JPQLException
Exception Description: Syntax error parsing the query [select bonjour(:nom) from dual], line 1, column 14: syntax error at [(].
Internal Exception: MismatchedTokenException(83!=33)

est ce que vous pouvez me dire comment je dois procéder pour réussir mes appels à mes fonctions ?

Merci
at org.eclipse.persistence.exceptions.JPQLException.syntaxErrorAt(JPQLException.java:362)
at org.eclipse.persistence.internal.jpa.parsing.jpql.JPQLParser.handleRecognitionException(JPQLParser.java:301)
at org.eclipse.persistence.internal.jpa.parsing.jpql.JPQLParser.addError(JPQLParser.java:242)
at org.eclipse.persistence.internal.jpa.parsing.jpql.JPQLParser.reportError(JPQLParser.java:359)
at org.eclipse.persistence.internal.libraries.antlr.runtime.BaseRecognizer.recoverFromMismatchedElement(Unknown Source)
at org.eclipse.persistence.internal.libraries.antlr.runtime.BaseRecognizer.recoverFromMismatchedToken(Unknown Source)
at org.eclipse.persistence.internal.libraries.antlr.runtime.BaseRecognizer.mismatch(Unknown Source)
at org.eclipse.persistence.internal.libraries.antlr.runtime.BaseRecognizer.match(Unknown Source)
at org.eclipse.persistence.internal.jpa.parsing.jpql.antlr.JPQLParser.fromClause(JPQLParser.java:11162)
at org.eclipse.persistence.internal.jpa.parsing.jpql.antlr.JPQLParser.selectStatement(JPQLParser.java:355)
at org.eclipse.persistence.internal.jpa.parsing.jpql.antlr.JPQLParser.document(JPQLParser.java:275)
at org.eclipse.persistence.internal.jpa.parsing.jpql.JPQLParser.parse(JPQLParser.java:130)
at org.eclipse.persistence.internal.jpa.parsing.jpql.JPQLParser.buildParseTree(JPQLParser.java:91)
at org.eclipse.persistence.internal.jpa.EJBQueryImpl.buildEJBQLDatabaseQuery(EJBQueryImpl.java:207)
at org.eclipse.persistence.internal.jpa.EJBQueryImpl.buildEJBQLDatabaseQuery(EJBQueryImpl.java:182)
at org.eclipse.persistence.internal.jpa.EJBQueryImpl.<init>(EJBQueryImpl.java:134)
at org.eclipse.persistence.internal.jpa.EJBQueryImpl.<init>(EJBQueryImpl.java:118)
at org.eclipse.persistence.internal.jpa.EntityManagerImpl.createQuery(EntityManagerImpl.java:1373)
... 1 more
Caused by: MismatchedTokenException(83!=33)
... 13 more