【问题标题】:Unable to have correct value with SELECT query using MAX() in JPA在 JPA 中使用 MAX() 的 SELECT 查询无法获得正确的值
【发布时间】: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


【解决方案1】:

你可以直接使用更简单的JPQL

return (Integer)entityManager.createQuery("select max(u.id) from User u").getSingleResult();

或使用TypedQuery

return entityManager.createQuery("select max(u.id) from User u", Integer.class).getSingleResult();

编辑:

Unknown entity type [user]

您应该使用User 而不是user

【讨论】:

  • 感谢您的回答。我试图修改代码,但它仍然没有返回值。当我尝试坚持任何对象时,我确实喜欢这样并且没有问题。 entityManager.getTransaction().begin(); entityManager.persist(user); entityManager.getTransaction().commit(); 但是查询不正常,我不知道为什么。
  • Hello Pau,意味着对 getMaxId() 函数的调用总是会在服务层引发 catch()(请参阅更新)
  • 你能记录下 catch 语句中捕获的异常吗?
  • @PauKiatWee 我应该在哪里使用users?在 JPQL 语句中?它也不起作用。我刚变了。我在users 遇到了同样的错误。
  • @Julián 在 JPQL 中应该使用实体名,而 SQL 是使用表名。
【解决方案2】:

嗯,从你的 cmets 很难说,你还没有发布任何日志记录。

这个怎么样:

Query query = entityManager.createQuery("SELECT u FROM users u WHERE u.id = (SELECT MAX(u.id) FROM users u)");

【讨论】:

    【解决方案3】:

    我正在使用该代码:

        Query qry = em.createQuery("SELECT MAX(t.column) FROM Table t");
        Object obj = qry.getSingleResult();
        if(obj==null) return 0;
        return (Integer)obj;
    

    因为如果 Table "t" 上没有元素,就会抛出 NullpointerException。

    【讨论】:

      【解决方案4】:

      这是一个很好的解决方案,但是您必须在 sql 的两个部分中使用不同的名称。像这样: "SELECT u FROM users u WHERE u.id = (SELECT MAX(u2.id) FROM users u2)"

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-02-06
        • 2011-08-19
        • 1970-01-01
        • 2019-02-25
        • 2019-11-05
        • 1970-01-01
        • 2014-11-22
        • 2018-09-10
        相关资源
        最近更新 更多