Java 无法在JPA中使用MAX()使用SELECT查询获得正确的值

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

我是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和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;