2014-12-02 104 views
0

是新來的JPA。使用where子句構建select查詢。我需要從表聯繫人中選擇與String名稱的值相等的所有ContactName。CriteriaBuilder在JPA - where子句

使用下面的代碼來創建數據庫表:

CREATE TABLE Contacts (
ContactId BIGINT UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT, 
ContactName VARCHAR(100) NOT NULL, 
ContactEmailID VARCHAR(100) NOT NULL, 
UserName VARCHAR(100) NOT NULL, 
INDEX Contact_Names (ContactName) 
) ENGINE = InnoDB; 

以下是我的實體類;

 @Entity 

    private String UserName; 

    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    @Column(name = "ContactId") 
    public long getContactId() { 
     return ContactId; 
    } 

    public void setContactId(long contactId) { 
     ContactId = contactId; 
    } 


    @Basic 
    @Column(name = "UserName") 
    public String getUserName() { 
    return UserName; 
    } 

    public void setUserName(String UserName) { 
    this.UserName = UserName; 
    } 

以下是我的ContactServlet類代碼,我試圖編寫我的CriteriaBuilder代碼。

  EntityManager manager = null; 
     EntityTransaction transaction = null; 
     try{ 

     manager = this.factory.createEntityManager(); 
     transaction = manager.getTransaction(); 
     transaction.begin(); 

     CriteriaBuilder cb = manager.getCriteriaBuilder(); 
     CriteriaQuery<Contact> q1 = cb.createQuery(Contact.class); 
     Root<Contact> postRoot = q1.from(Contact.class); 

     q1.select(postRoot).where(cb.equal(postRoot.get("UserName"), name)); 
     TypedQuery<Contact> qry = manager.createQuery(q1); 

     List<Contact> result = qry.getResultList(); 
     for (Contact contactInstance : result) 
     { 

     DBContactName = contactInstance.getContactName().trim(); 
     DBContactEmail = contactInstance.getContactEmailID().trim(); 

.....

不知道我要去哪裏錯了?

以下是錯誤在執行我的項目: java.lang.IllegalArgumentException異常:無法在org.hibernate.jpa.criteria.path.Abs​​tractPathImpl.unknownAttribute解析屬性[用戶名]針對路徑(AbstractPathImpl.java:117)在org.hibernate.jpa.criteria.path.Abs​​tractPathImpl.locateAttribute(AbstractPathImpl.java:214)在org.hibernate.jpa.criteria.path.Abs​​tractPathImpl.get(AbstractPathImpl.java:185)在com.ContactServlet.doPost(ContactServlet .java:110)at javax.servlet.http.HttpServlet.service(HttpServlet.java:644)at javax.servlet.http.HttpServlet.service(HttpServlet.java:725)at org.apache.catalina.core.ApplicationFilterChain。 internalDoFilter(ApplicationFilterChain.java:291)在org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)在org.apache.tomcat.websocket.server.WsFilter.doFilter(W在org.apache.catalina上的org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)處的org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239)上的sFilter.java:52) .core.StandardWrapperValve.invoke(StandardWrapperValve.java:219)at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:106)at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:505 )在org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:142)org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79)at org.apache.catalina.valves.AbstractAccessLogValve。在org.apache的org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:534)處調用(AbstractAccessLogValve.java:610)org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:88) .coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1081)at org.apache .coyote.AbstractProtocol $ AbstractConnectionHandler.process(AbstractProtocol.java:658)at org.apache.coyote.http11.Http11NioProtocol $ Http11ConnectionHandler.process(Http11NioProtocol.java:222)at org.apache.tomcat.util.net.NioEndpoint $ SocketProcessor .doRun(NioEndpoint.java:1566)在org.apache.tomcat.util.net.NioEndpoint $ SocketProcessor.run(NioEndpoint.java:1523)在java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)在java.util.concurrent.ThreadPoolExecutor $ Worker.run(ThreadPoolExecutor.java:617)at org.apache.tomcat.util.threads.TaskThread $ WrappingRunnable.run(TaskThread.java:61)at java.lang.Thread.run( Thread.java:745)

+0

我的第一個問題是您需要將q1.select語句的結果傳遞給createQuery調用,例如manager.createQuery(q1.select(...)); – 2014-12-02 01:20:14

+0

我試圖通過整個查詢,因爲你建議..但沒有結果...仍然是相同的錯誤。其實它不認識這個stmt屬性「用戶名」。 q1.select(postRoot).where(cb.equal(postRoot.get(「UserName」),name)); – Dipali 2014-12-02 01:42:49

回答

0

嘗試:

q1.select(postRoot).where(cb.equal(postRoot.get("userName"), name)); 

UserName屬性的小寫字母的u

+0

哇..驚人..非常感謝..它的工作:) – Dipali 2014-12-02 02:09:03

+0

你可以請解釋我爲什麼在這種情況下工作?再次感謝。 – Dipali 2014-12-02 02:13:48

+0

首先,您應該查看[Java命名約定](http://www.oracle.com/technetwork/java/codeconventions-135099.html)。對於您遇到的問題,JPA使用getter/setter約定,getUserName()/ setUserName()與** u ** serName相關,而不是** U ** serName。 – Mooolo 2014-12-02 02:49:31