CriteriaBuilder в JPA - где пункт

1

Я новичок в JPA. Построение запроса select с предложением where. Мне нужно выбрать из таблицы Contacts all ContactName, равную значению имени String.

Для создания таблицы DB используется следующий код:

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

Ниже приведен мой код класса 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.AbstractPathImpl.unknownAttribute(AbstractPathImpl.java:117) в org.hibernate. jpa.criteria.path.AbstractPathImpl.locateAttribute(AbstractPathImpl.java:214) на org.hibernate.jpa.criteria.path.AbstractPathImpl.get(AbstractPathImpl.java:185) в com.ContactServlet.doPost(ContactServlet.java:110) в javax.servlet.http.HttpServlet.service(HttpServlet.java:644) в javax.servlet.http.HttpServlet.service(HttpServlet.java:725) в 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(WsFilter.java:52) на org.apache.catalina. core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239) в org.apache.catalina.core.Applicat ionFilterChain.doFilter(ApplicationFilterChain.java:206) в org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:219) в org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:106) в 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.invoke(AbstractAccessLogValve.java:610) на org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:88) на org.apache.catalina. connector.CoyoteAdapter.service(CoyoteAdapter.java:534) на org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1081) на org.apache.coyote.AbstractProtocol $ AbstractConnectionHandler.process(AbstractProtocol.java:658) at org.apache.coyote.http11.Http11NioProtocol $ Http11ConnectionHandle r.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) в java.util.concurrent.ThreadPoolExecutor $ Worker.run(ThreadPoolExecutor.java:617) в org.apache.tomcat.util.threads.TaskThread $ WrappingRunnable.run(TaskThread.java:61) в java.lang.Thread.run(Thread.java:745)

  • 0
    Вначале я хотел бы передать результат из оператора q1.select в вызов createQuery, например, manager.createQuery (q1.select (...));
  • 0
    Я пытался передать весь запрос, как вы предложили ... но без результатов ... все та же ошибка. На самом деле это не признает атрибут «UserName» в этом stmt. q1.select (postRoot) .where (cb.equal (postRoot.get ("UserName"), name));
Теги:
hibernate
jpa
hibernate-criteria

1 ответ

1
Лучший ответ

Попробуйте:

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

Итрибут u атрибута UserName в нижнем регистре.

  • 0
    Вау .. удивительно .. спасибо большое .. это сработало :)
  • 0
    Можете ли вы объяснить мне, почему это работает в этом случае? еще раз спасибо.
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню