Java 无法在JPA中使用MAX()使用SELECT查询获得正确的值
我是JPA新手,在尝试使用MAX函数查询数据库时遇到了一个问题。 我的函数代码如下。有人能帮我吗?多谢各位Java 无法在JPA中使用MAX()使用SELECT查询获得正确的值,java,jpa,derby,jpql,toplink,Java,Jpa,Derby,Jpql,Toplink,我是JPA新手,在尝试使用MAX函数查询数据库时遇到了一个问题。 我的函数代码如下。有人能帮我吗?多谢各位 public int getMaxId(){ entityManager = this.entityManagerFactory.createEntityManager(); Query query = entityManager.createQuery("SELECT * FROM user WHERE id = (SELECT MAX(u.id) FROM user
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和ApacheDerby。我的方法应该返回表用户的最大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
您可以直接使用更简单的JPQL
return (Integer)entityManager.createQuery("select max(u.id) from User u").getSingleResult();
或使用
编辑:
您应该使用User而不是User。从您的评论很难说,而且您还没有发布任何日志 这个怎么样:
Query query = entityManager.createQuery("SELECT u FROM users u WHERE u.id = (SELECT MAX(u.id) FROM users u)");
我在使用那个代码:
Query qry = em.createQuery("SELECT MAX(t.column) FROM Table t");
Object obj = qry.getSingleResult();
if(obj==null) return 0;
return (Integer)obj;
因为如果表t上没有元素,就会抛出NullpointerException。这是一个很好的解决方案,但在sql的这两部分中必须使用不同的名称。这样地:
从用户u中选择u,其中u.id=从用户u2中选择MAXu2.id我建议使用生成的id值。您不应该接受异常,请尝试使用ex.printStackTrace打印完整的错误堆栈以了解详细信息。@JMelnik Yes,我同意,但我想了解JPA/JPQL it在尝试使用持久性操作和查询时是如何工作的。@PauKiatWee谢谢你的建议,我刚刚在我的代码中添加了PrinstackTrace。@Julián查找书籍、文档,最后是实现的源代码。谢谢你的回答。我试图修改代码,但仍然没有返回值。当我试图持久化任何对象时,我就是这样做的,没有任何问题。entityManager.getTransaction.begin;entityManager.persistuser;entityManager.getTransaction.commit;但是querys不能正常工作,我不知道为什么。Hello Pau,意味着对getMaxId函数的调用总是在服务层引发catch。请参阅Update您可以将捕获的异常记录在catch语句中吗?@PauKiatWee我应该在哪里使用用户?在JPQL语句中?它也不起作用。我刚换了衣服。我对用户也有同样的错误。@JPQL中的Julián应该使用实体名,而SQL使用表名。
Unknown entity type [user]
Query query = entityManager.createQuery("SELECT u FROM users u WHERE u.id = (SELECT MAX(u.id) FROM users u)");
Query qry = em.createQuery("SELECT MAX(t.column) FROM Table t");
Object obj = qry.getSingleResult();
if(obj==null) return 0;
return (Integer)obj;