6

私は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」です。

Edit(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;
4

4 に答える 4

21

よりシンプルな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ます。

于 2012-06-12T08:13:37.990 に答える
4

さて、あなたのコメントから言うのは難しいです、そしてあなたはログを投稿していません。

これはどう:

Query query = entityManager.createQuery("SELECT u FROM users u WHERE u.id = (SELECT MAX(u.id) FROM users u)");
于 2012-06-12T08:14:28.980 に答える
1

そのコードを使用しています:

    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がスローされます。

于 2013-08-22T18:07:57.523 に答える
-3

これは良い解決策ですが、SQLの2つの部分で異なる名前を使用する必要があります。このように: "SELECT u FROM users u WHERE u.id =(SELECT MAX(u2.id)FROM users u2)"

于 2014-02-20T14:21:58.387 に答える