CriteriaBuilder在JPA - where子句
是新来的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.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)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)
尝试:
q1.select(postRoot).where(cb.equal(postRoot.get("userName"), name));
UserName属性的小写字母的u。
哇..惊人..非常感谢..它的工作:) – Dipali 2014-12-02 02:09:03
你可以请解释我为什么在这种情况下工作?再次感谢。 – Dipali 2014-12-02 02:13:48
首先,您应该查看[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
我的第一个问题是您需要将q1.select语句的结果传递给createQuery调用,例如manager.createQuery(q1.select(...)); – 2014-12-02 01:20:14
我试图通过整个查询,因为你建议..但没有结果...仍然是相同的错误。其实它不认识这个stmt属性“用户名”。 q1.select(postRoot).where(cb.equal(postRoot.get(“UserName”),name)); – Dipali 2014-12-02 01:42:49