【发布时间】:2012-06-15 02:21:37
【问题描述】:
我是 JPA 的新手,当我尝试使用 MAX() 函数查询数据库时遇到问题。 我的功能代码如下。谁能帮我?谢谢。
public int getMaxId(){
entityManager = this.entityManagerFactory.createEntityManager();
Query query = entityManager.createQuery("SELECT * FROM user WHERE id = (SELECT MAX(u.id) FROM user u)");
User user = (User) query.getSingleResult();
int id = user.getId();
return id;
}
我正在使用 JPA、TopLink 和 Apache Derby。我的方法应该返回表用户的最大 id。
编辑:我从服务中调用该函数:
try {
int id = userDAO.getMaxId();
logger.info("Max id: " + id);
user.setId(id+1);
}
catch (Exception ex){
logger.error("Unable to get the max id.");
}
user.setId() 的值始终为“0”。
编辑(2):日志
Caused by: Exception [EclipseLink-8034] (Eclipse Persistence Services - 2.3.0.v20110604-r9504): org.eclipse.persistence.exceptions.JPQLException
Exception Description: Error compiling the query [SELECT u FROM user u WHERE u.id = (SELECT MAX(uu.id) FROM user uu)]. Unknown entity type [user].
at org.eclipse.persistence.exceptions.JPQLException.entityTypeNotFound(JPQLException.java:483)
at org.eclipse.persistence.internal.jpa.parsing.ParseTreeContext.classForSchemaName(ParseTreeContext.java:138)
at org.eclipse.persistence.internal.jpa.parsing.SelectNode.getClassOfFirstVariable(SelectNode.java:327)
at org.eclipse.persistence.internal.jpa.parsing.SelectNode.getReferenceClass(SelectNode.java:316)
at org.eclipse.persistence.internal.jpa.parsing.ParseTree.getReferenceClass(ParseTree.java:436)
at org.eclipse.persistence.internal.jpa.parsing.ParseTree.adjustReferenceClassForQuery(ParseTree.java:75)
at org.eclipse.persistence.internal.jpa.parsing.JPQLParseTree.populateReadQueryInternal(JPQLParseTree.java:103)
at org.eclipse.persistence.internal.jpa.parsing.JPQLParseTree.populateQuery(JPQLParseTree.java:84)
at org.eclipse.persistence.internal.jpa.EJBQueryImpl.buildEJBQLDatabaseQuery(EJBQueryImpl.java:219)
at org.eclipse.persistence.internal.jpa.EJBQueryImpl.buildEJBQLDatabaseQuery(EJBQueryImpl.java:190)
at org.eclipse.persistence.internal.jpa.EJBQueryImpl.<init>(EJBQueryImpl.java:142)
at org.eclipse.persistence.internal.jpa.EJBQueryImpl.<init>(EJBQueryImpl.java:126)
at org.eclipse.persistence.internal.jpa.EntityManagerImpl.createQuery(EntityManagerImpl.java:1475)
... 35 more
我的实体User声明如下:
@Entity
@Table(name = "user")
public class User {
@Id
private int id;
private String name;
private String lastName;
private String city;
private String password;
【问题讨论】:
-
我建议使用生成的 ID 值。
-
您不应该吞下异常,尝试使用
ex.printStackTrace()打印完整的错误堆栈以获取更多详细信息。 -
@JMelnik 是的,我同意,但我想了解 JPA/JPQL 在尝试使用持久性操作和查询时是如何工作的。
-
@PauKiatWee 感谢您的建议,我刚刚将
prinstStackTrace()添加到我的代码中。 -
@Julián 查找书籍、文档和最终实现的源代码。
标签: java jpa derby jpql toplink