2010-08-18 20 views
1

J'ai un problème pour faire fonctionner jpa. A la suite exception apparaît lorsque je tente d'exécuter le Login.javaNoViableAltException utilisant jpa

WicketMessage: instanciation page à l'aide constructeur de.test.pages.LoginPage public()

cause racine:

NoViableAltException (93! = [364: 1: selectExpression renvoie [Nœud d'objet]: (n = aggregateExpression | n = expression scalaire | OBJECT LEFT_ROUND_BRACKET n = variableAccessOrTypeConstant RIGHT_ROUND_BRACKET | n = constructorExpression | n = mapEntryExpression);]) at org.eclipse.persistence. internal.jpa.parsing.jpql.antlr.JPQLParser.selectExpression (JPQLParser.java:5893) à org.eclipse.persistence.internal.jpa.parsing.jpql.antlr.JPQLParser.selectItem (JPQLParser.java:1356) à org.eclipse.persistence.internal.jpa.parsing.jpql.antlr.JPQLParser.selectClause (JPQLParser.java:1270) à org.eclipse.persistence.internal.jpa.parsing.jpql.antlr.JPQLParser.selectStatement (JPQLParser.java:351) à org.eclipse.persistence.internal.jpa.parsing.jpql. antlr.JPQLParser.document (JPQLParser.java:275) à org.eclipse.persistence.internal.jpa.parsing.jpql.JPQLParser.parse (JPQLParser.java:130) à org.eclipse.persistence.internal.jpa. parsing.jpql.JPQLParser.buildParseTree (JPQLParser.java:91) à org.eclipse.persistence.internal.jpa.EJBQueryImpl.buildEJBQLDatabaseQuery (EJBQueryImpl.java:207) à org.eclipse.persistence.internal.jpa.EJBQueryImpl. bui ldEJBQLDatabaseQuery (EJBQueryImpl.java:182) à org.eclipse.persistence.internal.jpa.EJBQueryImpl. (EJBQueryImpl.java:134) à org.eclipse.persistence.internal.jpa.EJBQueryImpl. (EJBQueryImpl.java:118) à org.eclipse.persistence.internal.jpa.EntityManagerImpl.createQuery (EntityManagerImpl.java:1352) à de.test.pages.LoginPage. (Source inconnue) à java.lang.reflect.Constructor.newInstance (Constructeur. java: 513) à org.apache.wicket.session.DefaultPageFactory.createPage (DefaultPageFactory.java:192) à org.apache.wicket.session.DefaultPageFactory.newPage (DefaultPageFactory.java:57) à org.apache. wicket.request.target.component.BookmarkablePageRequestTarget.newPage (BookmarkablePageRequestTarget.java:298) at org.a pache.wicket.request.target.component.BookmarkablePageRequestTarget.getPage (BookmarkablePageRequestTarget.java:320) à org.apache.wicket.request.target.component.BookmarkablePageRequestTarget.processEvents (BookmarkablePageRequestTarget.java:234) à org.apache. wicket.request.AbstractRequestCycleProcessor.processEvents (AbstractRequestCycleProcessor.java:92) à org.apache.wicket.RequestCycle.processEventsAndRespond (RequestCycle.java:1250) à org.apache.wicket.RequestCycle.step (RequestCycle.java:1329) à org.apache.wicket.RequestCycle.steps (RequestCycle.java:1428) à org.apache.wicket.RequestCycle.request (RequestCycle.java:545) à org.apache.wicket.protocol.http.WicketFilter. doGet (WicketFilter.java:479) à org.apache.wicket.protocol.http. WicketFilter.doFilter (WicketFilter.java:312) à org.apache.catalina.core.ApplicationFilterChain.internalDoFilter (ApplicationFilterChain.java:215) à org.apache.catalina.core.ApplicationFilterChain.doFilter (ApplicationFilterChain.java:188) à org.apache.catalina.core.StandardWrapperValve.invoke (StandardWrapperValve.java:213) à org.apache.catalina.core.StandardContextValve.invoke (StandardContextValve.java:172) à org.apache.catalina.core. StandardHostValve.invoke (StandardHostValve.java:127) à org.apache.catalina.valves.ErrorReportValve.invoke (ErrorReportValve.java:117) à org.apache.catalina.core.StandardEngineValve.invoke (StandardEngineValve.java:108) à org.apache.catalina.connector.CoyoteAdapter.service (CoyoteAdapter.java:174) à org.apache.coyote.http11.Http11Processor.http11 (Http11Processor.java:873) à org.apache.coyote.http11.Http11BaseProtocol $ Http11ConnectionHandler.processConnection (Http11BaseProtocol.java:665) à org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket (PoolTcpEndpoint.java:528) à org.apache. tomcat.util.net.LeaderFollowerWorkerThread.runIt (LeaderFollowerWorkerThread.java:81) à org.apache.tomcat.util.threads.ThreadPool $ ControlRunnable.run (ThreadPool.java:689) à java.lang.Thread.run (Thread.java:637)

La méthode LoginPage() dans Login.java ressemble à ceci:

LoginPage public() {

EntityManagerFactory factory = Persistence.createEntityManagerFactory("quickstartUser"); 
    EntityManager em = factory.createEntityManager(); 

    // Read the existing entries 
    Query q = em.createQuery("SELECT * FROM quickstart_user"); 
    // Persons should be empty 

    // Do we have entries? 
    int createNewEntries = q.getResultList().size(); 

    Label label = new Label("result", "Result: "); 
    add(label); 

    // It is always good practice to close the EntityManager so that 
    // resources are conserved. 
    em.close(); 

Le persistance.xml

<persistence-unit name="quickstartUser" transaction-type="RESOURCE_LOCAL"> 

    <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider> 

    <exclude-unlisted-classes>false</exclude-unlisted-classes> 

    <properties> 
     <property name="eclipselink.jdbc.driver" value="org.postgresql.Driver" /> 
     <property name="eclipselink.jdbc.url" value="jdbc:postgresql://localhost:5432/test" /> 
     <!-- I work in this example without user/password.--> 
     <property name="eclipselink.jdbc.user" value="" /> 
     <property name="eclipselink.jdbc.password" value="" /> 

     <!-- EclipseLink should create the database schema automatically --> 

     <property name="eclipselink.ddl-generation" value="drop-and-create-tables" /> 
     <property name="eclipselink.ddl-generation.output-mode" value="database" /> 
    </properties> 

</persistence-unit> 

Bien que le tableau doit être créé automatiquement, J'ai dû créer la table sur moi-même.

Au moins le modèle d'entité QuickstartUser.java

@Entity public class QuickstartUser { @Id @GeneratedValue (stratégie = GenerationType.TABLE) id private int; private Chaîne firstName; private Chaîne lastName; private Mot de passe String; private Chaîne nom d'utilisateur;

public int getId() { 
    return id; 
} 
public void setId(int id) { 
    this.id = id; 
} 
public String getFirstName() { 
    return firstName; 
} 
public void setFirstName(String firstName) { 
    this.firstName = firstName; 
} 
public String getLastName() { 
    return lastName; 
} 
public void setLastName(String lastName) { 
    this.lastName = lastName; 
} 
public String getPassword() { 
    return password; 
} 
public void setPassword(String password) { 
    this.password = password; 
} 
public String getUsername() { 
    return username; 
} 
public void setUsername(String username) { 
    this.username = username; 
} 

}

Merci pour la lecture.

BVA

Répondre

1

J'étudie actuellement JPA, mais je généralement écrire une requête comme

SELECT * FROM quickstart_user

comme

SELECT q DE quickstart_user q

Can vous essayez de changer votre code et voir si cela fonctionnera? En guise de remarque, j'ai également constaté que, pour certains de mes projets, la mise en œuvre d'Hibernate JPA fonctionne mieux que celle d'Eclipse.

+0

Bonjour, j'ai obtenu un résultat et l'exception est partie. Quelle est l'idée d'utiliser la requête comme vous l'avez fait? –

+0

La syntaxe du langage de requête JPA est similaire à SQL, mais il n'en implémente qu'un sous-ensemble. EntityManager fournit createNativeQuery et createNamedQuery qui autorisent les requêtes SQL, tandis que createQuery ne prend en charge que JQL. –

+0

Ceci est un message d'exception terrible et j'ai déposé un bug (https://bugs.eclipse.org/bugs/show_bug.cgi?id=323038) pour qu'il change changé. S'il vous plaît voter pour le bug si vous êtes intéressé. –

1

Ce n'est pas vraiment la réponse à votre problème, mais:

Vous ne devriez jamais le code de base de données à l'intérieur d'un appel composant d'extrémité avant, c'est un terrible mélange de modèle et la vue. Vous devez créer un service pour accéder à votre base de données (en utilisant JPA ou autre) et injecter ce service dans votre page (en utilisant des écouteurs d'instanciation de composants avec wicket-spring ou wicket-guice) ou votre application wicket.