2012-06-12 31 views
6

Tôi mới trong JPA và tôi gặp sự cố khi cố gắng truy vấn cơ sở dữ liệu bằng hàm MAX(). Mã chức năng của tôi đang theo dõi. Ai giúp tôi với? Cảm ơn bạn.Không thể có giá trị đúng với truy vấn SELECT bằng MAX() trong JPA

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; 
} 

Tôi đang sử dụng JPA, TopLink và Apache Derby. Phương thức của tôi sẽ trả về id tối đa của người dùng bảng.

Edit: Tôi gọi đó là chức năng từ một dịch vụ:

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."); 
    } 

Giá trị của user.setId() luôn là '0'.

Chỉnh sửa (2): Đăng nhập

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 

thực thể của tôi User được khai báo như sau:

@Entity 
@Table(name = "user") 
public class User { 

@Id 
private int id; 
private String name; 
private String lastName; 
private String city; 
private String password; 
+2

Tôi khuyên bạn nên sử dụng các giá trị ID đã tạo. – JMelnik

+1

Bạn không nên nuốt ngoại lệ, hãy thử sử dụng 'ex.printStackTrace()' để in đầy đủ lỗi ngăn xếp để biết thêm chi tiết. –

+0

@JMelnik Có, tôi đồng ý nhưng tôi muốn hiểu JPA/JPQL hoạt động như thế nào khi cố gắng sử dụng các truy vấn và truy vấn liên tục. – Spacemonkey

Trả lời

20

Bạn có thể trực tiếp sử dụng JPQL đơn giản hơn

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

Hoặc sử dụng TypedQuery

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

EDIT:

Unknown entity type [user] 

Bạn nên sử dụng User thay vì user.

+0

Cảm ơn câu trả lời của bạn. Tôi đã thử sửa đổi mã nhưng nó vẫn không trả về một giá trị. Khi tôi cố gắng kiên trì bất kỳ đối tượng nào tôi làm như thế này và không có vấn đề gì. entityManager.getTransaction().begin(); entityManager.persist(user); entityManager.getTransaction().commit(); Nhưng truy vấn không hoạt động tốt, tôi không biết tại sao. – Spacemonkey

+0

@ Julián Giá trị trả lại không có nghĩa là gì? giá trị là sai? –

+0

Xin chào Pau, có nghĩa là cuộc gọi đến hàm getMaxId() luôn làm tăng catch() trong lớp Dịch vụ (xem cập nhật) – Spacemonkey

2

Rất khó để nói từ nhận xét của bạn và bạn chưa đăng bất kỳ nhật ký nào.

Làm thế nào về điều này:

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

plus 1 yes nó hoạt động tốt :) –

1

Im Sử dụng mã rằng:

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

nếu không có các yếu tố trên Bảng "t", NullPointerException là ném.

-2

Đó là một giải pháp tốt, nhưng bạn phải sử dụng các tên khác nhau trong tho hai phần của sql. Như thế này: "CHỌN u TỪ người dùng u Ở ĐÂU u.id = (CHỌN MAX (u2.id) TỪ người dùng u2)"

Các vấn đề liên quan