Jestem nowy w JPA i mam problem, gdy próbuję wysłać zapytanie do bazy danych za pomocą funkcji MAX(). Kod funkcji jest następujący. Czy ktoś może mi pomóc? Dziękuję Ci.Nie można uzyskać poprawnej wartości za pomocą zapytania SELECT za pomocą MAX() w 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;
}
Używam JPA, TopLink i Apache Derby. Moja metoda powinna zwracać maksymalny identyfikator użytkowników tabel.
Edit: Ja nazywam tę funkcję z usługi:
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.");
}
Wartość user.setId()
zawsze jest '0'.
Edit (2): Zaloguj
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
Moja jednostka User
jest zadeklarowana następująco:
@Entity
@Table(name = "user")
public class User {
@Id
private int id;
private String name;
private String lastName;
private String city;
private String password;
Proponuję użyć wygenerowanych wartości ID. – JMelnik
Nie powinieneś przełamać wyjątku, spróbuj użyć 'ex.printStackTrace()', aby wydrukować pełny stos błędów, aby uzyskać więcej szczegółów. –
@JMelnik Tak, zgadzam się, ale chciałem zrozumieć, w jaki sposób JPA/JPQL działa, próbując użyć trwałych operacji i zapytań. – Spacemonkey