2010-08-18 93 views
1

我有问题让jpa运行。采用构造公共de.test.pages.LoginPage()无法实例页面NoViableAltException使用jpa

根源:

NoViableAltException(当我尝试运行Login.java

WicketMessage出现以下异常93!= [364:1:selectExpression返回[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。在org.eclipse.persistence.internal.jpa.EJBQueryImpl的org.eclipse.persistence.internal.jpa.EJBQueryImpl.buildEJBQLDatabaseQuery(EJBQueryImpl.java:207) 处使用parsing.jpql.JPQLParser.buildParseTree(JPQLParser.java:91) 。 BUI ldEJBQLDatabaseQuery(EJBQueryImpl.java:182) 在org.eclipse.persistence.internal.jpa.EJBQueryImpl。(EJBQueryImpl.java:134) 在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.a在org.apache的org.apache.wicket.request.target.component.BookmarkablePageRequestTarget.processEvents(BookmarkablePageRequestTarget.java:234) (pache.wicket.request.target.component.BookmarkablePageRequestTarget.getPage(BookmarkablePageRequestTarget.java:320) )。在org.apache.wicket.RequestCycle.step(RequestCycle.java:1329)处的org.apache.wicket.RequestCycle.processEventsAndRespond(RequestCycle.java:1250) 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。在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) 在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) at org.apache.tomcat.util.threads.ThreadPool $ ControlRunnable.run(ThreadPool.java:689) at java.lang.Thread.run( Thread.java:637)

方法LoginPage()在Login.java看起来像这样:

公共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 { @Id @GeneratedValue(策略= GenerationType.TABLE) 私人诠释ID; private String 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

回答

1

目前,我正在学习JPA,但我通常写这样

SELECT *查询FROM quickstart_user

选择Q FROM quickstart_user q

灿你试图改变你的代码,看看这是否会工作? 另外,我还发现,对于我的一些项目,Hibernate JPA实现比Eclipse更好。

+0

嗨,我得到了一个结果,异常消失了。关于如何使用查询的想法是什么? – 2010-08-18 09:20:11

+0

JPA查询语言的语法与SQL类似,但它只实现它的一个子集。 EntityManager提供允许SQL查询的createNativeQuery和createNamedQuery,而createQuery只支持JQL。 – 2010-08-18 09:55:21

+0

这是一个可怕的异常消息,我已经提交了一个错误(https://bugs.eclipse.org/bugs/show_bug.cgi?id=323038),让它改变了。如果您有兴趣,请投票选出错误。 – 2010-08-18 14:43:22

1

这是不是真的回答你的问题,但:

你不应该从前端组件内调用数据库的代码,这是模型和视图的一个可怕的组合。

您应该创建一个服务来访问您的数据库(使用JPA或任何其他),并将此服务注入到您的页面(使用组件实例化监听器与wicket-spring或wicket-guice)或您的wicket应用程序。

这样,你可以测试每个层隔离