NoViableAltException с использованием jpa - PullRequest
1 голос
/ 18 августа 2010

У меня проблема с запуском jpa. Следующее исключение появляется при попытке запустить Login.java

WicketMessage: Не удается создать экземпляр страницы с помощью конструктора public de.test.pages.LoginPage ()

Основная причина:

NoViableAltException (93! = [364: 1: selectExpression возвращает [узел объекта]: (n = aggregateExpression | n = scalarExpression | OBJECT LEFT_ROUND_BRACKET n = variableAccessOrTypeConstant RIGHT_ROUND_BRACKET | n = constructorExpression] np) в 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.buildEJBQLDatabaseQuery (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) at de.test.pages.LoginPage. (Неизвестный источник) в java.lang.reflect.Constructor.newInstance (Constructor.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) на org.apache.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.process (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) at java.lang.Thread.run (Thread.java:637)

Метод LoginPage () в Login.java выглядит следующим образом:

public LoginPage () {

    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();

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>

Хотя таблица должна создаваться автоматически, мне пришлось создать таблицу на себя.

По крайней мере, модель объекта QuickstartUser.java

@ Entity открытый класс QuickstartUser { @Я бы @GeneratedValue (стратегии = GenerationType.TABLE) private int id; приватная строка firstName; private String lastName; приватный строковый пароль; личное имя пользователя;

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;
}

}

Спасибо за чтение.

BVA

Ответы [ 2 ]

1 голос
/ 18 августа 2010

Это на самом деле не решение вашей проблемы, но:

Никогда не следует вызывать код базы данных из компонента переднего плана, это ужасное сочетание модели и представления.

Вам следует создать сервис для доступа к вашей базе данных (с использованием JPA или чего-либо другого) и внедрить этот сервис либо на вашу страницу (с использованием слушателей создания экземпляров компонентов с wicket-spring или wicket-guice), либо в ваше приложение wicket.

Таким образомВы можете проверить каждый слой по отдельности

1 голос
/ 18 августа 2010

Я сейчас изучаю JPA, но обычно пишу запрос как

SELECT * FROM quickstart_user

в

ВЫБРАТЬ q ИЗ quickstart_user q

Можете ли вы попробовать изменить свой код и посмотреть, будет ли это работать? В качестве примечания я также обнаружил, что для некоторых моих проектов реализация Hibernate JPA работает лучше, чем реализация Eclipse.

...