2010-08-18 9 views
1

jpa를 실행하는 데 문제가 있습니다. 생성자 공공 de.test.pages.LoginPage()를 사용하여 페이지를 초기화 할 수 없습니다NoViableAltException jpa를 사용하는 경우

근본 원인 :

NoViableAltException (내가

WicketMessage Login.java를 실행하려고하면 다음과 같은 예외가 나타납니다 93 =! 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.buildEJBQLDatabaseQuery (EJBQueryImpl.java:207) at org.eclipse.persistence.internal.jpa.EJBQueryImpl에서 parsing.jpql.JPQLParser.buildParseTree (JPQLParser.java:91) 을 가져 오십시오. 부이 ldEJBQLDatabaseQuery (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 (알 수없는 소스) at java.lang.reflect.Constructor.newInstance (생성자. 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 pache.wicket.request.target.component.BookmarkablePageRequestTarget.getPage (BookmarkablePageRequestTarget.java:320) at org.apache.wicket.request.target.component.BookmarkablePageRequestTarget.processEvents (BookmarkablePageRequestTarget.java:234) at org.apache. org.apache.wicket.RequestCycle.step에서 org.apache.wicket.RequestCycle.processEventsAndRespond (RequestCycle.java:1250) 에서 wicket.request.AbstractRequestCycleProcessor.processEvents (AbstractRequestCycleProcessor.java:92) (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. (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) 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)

Login.java에

메소드 LoginPage()는 다음과 같다 :

공개 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 Public 클래스 QuickstartUser { @Id @GeneratedValue (전략 = GenerationType.TABLE) INT 개인 아이디; private 문자열 firstName; 전용 문자열 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를 공부하고 있지만, 나는 보통 quickstart_user로부터

SELECT * 같은 쿼리를 작성

로 quickstart_user q를 FROM

SELECT Q

수 코드를 변경하고 이것이 작동하는지 확인하려고합니까? 참고로, 나는 또한 일부 프로젝트에 대해 Hibernate JPA 구현이 Eclipse보다 잘 작동한다는 것을 발견했다.

+0

안녕하세요, 결과가 돌아오고 예외가 사라졌습니다. 당신이했던 것처럼 쿼리를 사용하는 것에 대한 아이디어는 무엇입니까? –

+0

JPA 쿼리 언어의 구문은 SQL과 유사하지만 SQL의 일부만 구현합니다. EntityManager는 SQL 쿼리를 허용하는 createNativeQuery 및 createNamedQuery를 제공하지만 createQuery는 JQL 만 지원합니다. –

+0

이것은 끔찍한 예외 메시지이며 변경된 버그가있는 버그 (https://bugs.eclipse.org/bugs/show_bug.cgi?id=323038)를 제출했습니다. 관심이 있다면 버그에 투표하십시오. –

1

이 정말 당신의 문제에 대한 답이 아니라 :

당신은 프런트 엔드 구성 요소 내부에서 데이터베이스 코드를 호출해서는 안,이 모델과 뷰의 끔찍한 혼합이다.

(JPA 등을 사용하여) 데이터베이스에 액세스하고 페이지 (wicket-spring 또는 wicket-guice가있는 구성 요소 인스턴스 생성 리스너 사용) 또는 개찰 응용 프로그램에이 서비스를 주입해야합니다.

그런 식으로 각 레이어를 개별적으로 테스트 할 수 있습니다.

관련 문제