簡體   English   中英

JPA中的CriteriaBuilder-where子句

[英]CriteriaBuilder in JPA - where clause

是JPA的新手。 使用where子句構建選擇查詢。 我需要從表Contacts中選擇所有等於String名稱值的ContactName。

使用以下代碼創建數據庫表:

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

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

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

         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上org.hibernate.jpa.criteria.path.Abs​​tractPathImpl.unknownAttribute(AbstractPathImpl.java:117)上的路徑解析屬性[UserName]。 org.hibernate.jpa.criteria.path.Abs​​tractPathImpl.get(AbstractPathImpl.java:185)的com.ContactServlet.doPost(ContactServlet.java:110)的jpa.criteria.path.Abs​​tractPathImpl.locateAttribute(AbstractPathImpl.java:214)在org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java)在javax.servlet.http.HttpServlet.service(HttpServlet.java:725)在javax.servlet.http.HttpServlet.service(HttpServlet.java:644) :291),位於org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52),位於org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52),位於org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)。 org.apache.catalina.core.Applicat上的core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239) 位於org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:106)的org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:219)的ionFilterChain.doFilter(ApplicationFilterChain.java:206) org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:142)處的.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:505)org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve .java:79)位於org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:610)位於org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:88)位於org.apache.catalina。 org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1081)的org.apache.coyote.AbstractProtocol $ AbstractConnectionHandler.process(AbstractProtocol.java:658)的connector.CoyoteAdapter.service(CoyoteAdapter.java:534)在org.apache.coyote.http11.Http11NioProtocol $ Http11ConnectionHandle org.apache.tomcat.util.net.NioEndpoint $ SocketProcessor.doRun(NioEndpoint.java:1566)的r.process(Http11NioProtocol.java:222)org.apache.tomcat.util.net.NioEndpoint $ SocketProcessor.run( NioEndpoint.java:1523),位於java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142),位於org.apache.tomcat.util,java.util.concurrent.ThreadPoolExecutor $ Worker.run(ThreadPoolExecutor.java:617) .threads.TaskThread $ WrappingRunnable.run(TaskThread.java:61)位於java.lang.Thread.run(Thread.java:745)

嘗試:

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

UserName屬性的u小寫。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM