【问题标题】:CriteriaBuilder in JPA - where clauseJPA 中的 CriteriaBuilder - where 子句
【发布时间】:2015-01-30 03:51:47
【问题描述】:

我是 JPA 的新手。使用 where 子句构建选择查询。我需要从表 Contacts 中选择与字符串名称值相等的所有 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

   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.jpa.criteria.path.Abs​​tractPathImpl.unknownAttribute(AbstractPathImpl.java:117) 在 org.hibernate.jpa.criteria.path.Abs​​tractPathImpl.locateAttribute 的路径解析属性 [UserName] (AbstractPathImpl.java:214) 在 org.hibernate.jpa.criteria.path.Abs​​tractPathImpl.get(AbstractPathImpl.java:185) 在 com.ContactServlet.doPost(ContactServlet.java:110) 在 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) at org.apache.catalina .core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 在 org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) 在 org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java :239) 在 org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java :206) 在 org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:106) 在 org.apache.catalina.authenticator 的 org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:219)。 AuthenticatorBase.invoke(AuthenticatorBase.java:505) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:142) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79) at org .apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:610) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:88) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter .java:534) 在 org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:658) 在 org.apache.coyote. http11.Http11NioProtocol$Http11ConnectionHandler.process(Http11NioProtocol.java:222) 在 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) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61 ) 在 java.lang.Thread.run(Thread.java:745)

【问题讨论】:

  • 我的第一个问题是您需要将 q1.select 语句的结果传递给 createQuery 调用,例如 manager.createQuery(q1.select(...));
  • 我试图按照你的建议传递整个查询..但没有结果......仍然是同样的错误。实际上它无法识别此 stmt 中的属性“用户名”。 q1.select(postRoot).where(cb.equal(postRoot.get("UserName"), name));

标签: java hibernate jpa hibernate-criteria


【解决方案1】:

尝试:

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

UserName属性的u小写。

【讨论】:

  • 你能解释一下为什么它在这种情况下有效吗?再次感谢。
  • 首先你应该看看Java naming conventions。对于您面临的问题,JPA 使用 getter/setter 约定,getUserName()/setUserName() 与 userName 相关,而不是 UserName.
猜你喜欢
  • 2012-06-25
  • 1970-01-01
  • 1970-01-01
  • 2011-01-27
  • 2012-02-19
  • 1970-01-01
  • 1970-01-01
  • 2011-06-25
  • 1970-01-01
相关资源
最近更新 更多