2012-06-12 5 views
6

JPAで新しく、MAX()関数を使用してデータベースにクエリを実行しようとすると問題が発生します。 私の機能のコードは以下のとおりです。誰でも助けてくれますか?ありがとうございました。JPAでMAX()を使用してSELECTクエリで正しい値を取得できません

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; 
+2

生成されたID値を使用することをお勧めします。 – JMelnik

+1

例外を飲み込むべきではありません。詳しくは 'ex.printStackTrace()'を使って完全なエラースタックを出力してみてください。 –

+0

@JMelnikはい、私は同意しますが、JPA/JPQLが永続的なopreationsとクエリをどのように使用しようとしているかを理解したかったのです。 – Spacemonkey

答えて

20

あなたが直接

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

またはTypedQuery

を使用し、よりシンプルなJPQLを使用することができます
return entityManager.createQuery("select max(u.id) from User u", Integer.class).getSingleResult(); 

EDIT:

Unknown entity type [user] 

あなたはuserの代わりにUserを使用する必要があります。

+0

あなたの答えをありがとう。私はコードを修正しようとしましたが、それでも値を返すわけではありません。私が何かオブジェクトを永続させようとすると、私はこれを好きになり、問題なくします。 entityManager.getTransaction().begin(); entityManager.persist(user); entityManager.getTransaction().commit();しかし、質問はうまくいきません。理由はわかりません。 – Spacemonkey

+0

@Julián値を返さないのはどうですか?値は間違っていますか? –

+0

Hello Pauは、getMaxId()関数の呼び出しが常にサービスレイヤーでcatch()を呼び出すことを意味します(更新を参照)。 – Spacemonkey

2

あなたのコメントからは言い難いですし、ロギングも投稿していません。そのコードを使用して

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

プラス1はいそれは良い:) –

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が投げています。

-2

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

関連する問題