java - 使用 jpa 出现 NoViableAltException

标签 java jpa wicket eclipselink

我在运行 jpa 时遇到问题。当我尝试运行 Login.java 时出现以下异常

WicketMessage: Can't instantiate page using constructor public de.test.pages.LoginPage()

Root cause:

NoViableAltException(93!=[364:1: selectExpression returns [Object node] : (n= aggregateExpression | n= scalarExpression | 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) at org.eclipse.persistence.internal.jpa.parsing.jpql.antlr.JPQLParser.selectItem(JPQLParser.java:1356) at org.eclipse.persistence.internal.jpa.parsing.jpql.antlr.JPQLParser.selectClause(JPQLParser.java:1270) at org.eclipse.persistence.internal.jpa.parsing.jpql.antlr.JPQLParser.selectStatement(JPQLParser.java:351) 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.(EJBQueryImpl.java:134) at org.eclipse.persistence.internal.jpa.EJBQueryImpl.(EJBQueryImpl.java:118) at org.eclipse.persistence.internal.jpa.EntityManagerImpl.createQuery(EntityManagerImpl.java:1352) at de.test.pages.LoginPage.(Unknown Source) at java.lang.reflect.Constructor.newInstance(Constructor.java:513) at org.apache.wicket.session.DefaultPageFactory.createPage(DefaultPageFactory.java:192) at org.apache.wicket.session.DefaultPageFactory.newPage(DefaultPageFactory.java:57) at org.apache.wicket.request.target.component.BookmarkablePageRequestTarget.newPage(BookmarkablePageRequestTarget.java:298) at org.apache.wicket.request.target.component.BookmarkablePageRequestTarget.getPage(BookmarkablePageRequestTarget.java:320) at org.apache.wicket.request.target.component.BookmarkablePageRequestTarget.processEvents(BookmarkablePageRequestTarget.java:234) at org.apache.wicket.request.AbstractRequestCycleProcessor.processEvents(AbstractRequestCycleProcessor.java:92) at org.apache.wicket.RequestCycle.processEventsAndRespond(RequestCycle.java:1250) at org.apache.wicket.RequestCycle.step(RequestCycle.java:1329) at org.apache.wicket.RequestCycle.steps(RequestCycle.java:1428) at org.apache.wicket.RequestCycle.request(RequestCycle.java:545) at org.apache.wicket.protocol.http.WicketFilter.doGet(WicketFilter.java:479) at org.apache.wicket.protocol.http.WicketFilter.doFilter(WicketFilter.java:312) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:215) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:188) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:213) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:172) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:117) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:108) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:174) at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:873) at org.apache.coyote.http11.Http11BaseProtocol$Http11ConnectionHandler.processConnection(Http11BaseProtocol.java:665) at org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java:528) at org.apache.tomcat.util.net.LeaderFollowerWorkerThread.runIt(LeaderFollowerWorkerThread.java:81) at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:689) at java.lang.Thread.run(Thread.java:637)

Login.java 中的 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();

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

@实体 公共(public)类快速入门用户{ @ID @GenerateValue(策略 = GenerationType.TABLE) 私有(private) int id; 私有(private)字符串名字; 私有(private)字符串姓氏; 私有(private)字符串密码; 私有(private)字符串用户名;

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

最佳答案

我目前正在学习 JPA,但我通常会写这样的查询

从quickstart_user中选择*

作为

从quickstart_user q中选择q

您可以尝试更改您的代码并看看这是否有效吗? 附带说明一下,我还发现,对于我的一些项目,Hibernate JPA 实现比 Eclipse 效果更好。

关于java - 使用 jpa 出现 NoViableAltException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3510263/

相关文章:

java - Mac echo $JAVA_HOME 返回空白

java - 尝试在泛型中使用原始类型时出现奇怪的编译时行为

java - 多个实体的通用 JPA 存储库

java - Jackson 对特定属性使用 getter

Java 8 流 : list to flat map grouped by

java - 在 CHROOT 环境中工作 - 尝试安装 JDK 时出错

java - JPA 查询子句 Where

java - 如何删除 Wicket 网页中的后缀

java - 如何在最终输出 html 中隐藏 wicket 容器和面板标签

java - 在 Wicket 渲染后向网页添加其他组件