2015-04-17 3 views
1

J'ai essayé d'obtenir les données de la fonction PostgresSQL, j'ai utilisé cet exemple hereJPA 2.1 Erreur: Aucun @NamedStoredProcedureQuery a été trouvé avec ce nom:

Ci-dessous la classe de mise en correspondance avec les données IN/OUT:

@XmlType(name="AccountRR") 
@NamedStoredProcedureQuery 
(
    name="getAccountMapping", 
    procedureName="accountFunction", 
    parameters = { 
        @StoredProcedureParameter(name="in_route", mode=ParameterMode.IN, type=String.class), 
        @StoredProcedureParameter(name="in_round", mode=ParameterMode.IN, type=String.class) 
      }, 
    resultSetMappings={"AccountRouteRoundMapping"} 
) 
@SqlResultSetMapping 
(
    name = "AccountRouteRoundMapping", 
    entities = 
    { 
     @EntityResult 
     (
      entityClass = AccountRouteRound.class, 
      fields = 
      { 
       @FieldResult(name = "name",   column = "name"), 
       @FieldResult(name = "address_1", column = "address_1"), 
       @FieldResult(name = "address_2", column = "address_2") 
       [....] 
      } 
     ) 
    } 
) 
public class AccountRouteRound {.............} 

Ci-dessous la classe où j'appelle createNamedStoredProcedureQuery

public static List<Account> getAccount(....) 
{ 
    em.getTransaction().begin(); 
    StoredProcedureQuery spq = em.createNamedStoredProcedureQuery("getAccountMapping"); 
    List CustomerRRDList = spq.getResultList(); 
    em.getTransaction().commit(); 
} 

J'ai reçu cette erreur:

**Caused by: java.lang.IllegalArgumentException: No @NamedStoredProcedureQuery was found with that name : getAccountMapping** 

Où dois-je insérer l'annotation? Qu'est-ce qui ne va pas ?

Merci

+0

Avez-vous oublié l'annotation '@ Entity'? – Kayaman

+0

J'ai essayé avec et sans '@ Entity' – sanfrareau

Répondre

1

Fixé. Je changé mon code:

public List<Account> getAccountFromStoreProcedure(EntityManager em, String routeCode, String round) 
{  
     StoredProcedureQuery storedProcedure = em.createStoredProcedureQuery("getAccountFunction"); 
    // set parameters 
     storedProcedure.registerStoredProcedureParameter("in_route", String.class, ParameterMode.IN); 
     storedProcedure.registerStoredProcedureParameter("in_round", String.class, ParameterMode.IN); 
     storedProcedure.setParameter("in_route",routeCode); 
     storedProcedure.setParameter("in_round",round); 
     storedProcedure.executeUpdate(); 

     List<Object> objectList = storedProcedure.getResultList(); 

     for (int i = 0; i< objectList.size(); i++) { 
      Account currAccount = new Account ((Object[]) objectList.get(i)); 
      tmpList.add(currAccount); 
      System.out.println("currAccount : " + currAccount.toString()); } 
    } 

Sur le compte constructeur:

public Account (Object[] fromStoredProcedure) { 
     super(); 
     this.name   = (String)fromStoredProcedure[0]; 
     this.address_1  = (String)fromStoredProcedure[1]; 
     this.address_2  = (String)fromStoredProcedure[2];   
    } 
0

J'ai essayé de cette façon et cela fonctionne, mais quand la fonction renvoie une liste, je ne sais pas comment puis-je obtenir tous les composants et l'insérer dans la liste:

StoredProcedureQuery storedProcedure = em.createStoredProcedureQuery("getAccountMapping"); 
// set parameters 
storedProcedure.registerStoredProcedureParameter("in_route",  String.class,  ParameterMode.IN); 
storedProcedure.registerStoredProcedureParameter("in_round",  String.class,  ParameterMode.IN); 
storedProcedure.registerStoredProcedureParameter("name",   String.class,  ParameterMode.OUT); 
storedProcedure.registerStoredProcedureParameter("address_1",  String.class,  ParameterMode.OUT); 
storedProcedure.registerStoredProcedureParameter("address_2",  String.class,  ParameterMode.OUT); 
[...........] 
storedProcedure.setParameter("in_route",routeCode); 
storedProcedure.setParameter("in_round",round); 
storedProcedure.execute(); 
String name = (String)storedProcedure.getOutputParameterValue("name"); 
[.......] 
    System.out.println("TEST : "+name);