2013-03-05 16 views
5

Używam Hibernate 4 i mam filtr na stronie JSF, aby uzyskać wyniki wyszukiwania. Podczas wykonywania wyszukiwania otrzymuję następujący wyjątekWartość parametru hibernacji [568903] nie pasuje do oczekiwanego typu [java.lang.Long]

java.lang.IllegalArgumentException: wartość parametru [568903] Nie znaleziono spodziewany typ [java.lang.Long] na org.hibernate.ejb.AbstractQueryImpl. validateParameterBinding (AbstractQueryImpl.java:370) w org.hibernate.ejb.AbstractQueryImpl.registerParameterBinding (AbstractQueryImpl.java:343) w org.hibernate.ejb.QueryImpl.setParameter (QueryImpl.java:370) w org.hibernate. ejb.QueryImpl.setParameter (QueryImpl.java:323)

Poniżej znajduje się mój fragment kodu, jak mogę rozwiązać ten problem?

private Long projectNo; 

public Long getProjectNo() { 
    return projectNo; 
} 

public void setProjectNo(Long projectNo) { 
    this.projectNo = projectNo; 
} 

I klasy DAO Mam następujący

String projectNo = filters.get("projectNo"); 
List<Predicate> criteria = new ArrayList<Predicate>(); 
    if (projectNo!= null) { 
    ParameterExpression<String> pexp = cb.parameter(String.class, "projectNo");    
    Predicate predicate = cb.equal(emp.get(Project_.projectNo), pexp); 
    criteria.add(predicate); 
} 
TypedQuery<Project> q = entityManager.createQuery(c); 
TypedQuery<Long> countquery = entityManager.createQuery(countQ); 
q.setParameter("projectNo", projectNo); // error in this line 
countquery.setParameter("projectNo", projectNo); 

Edycja 1

public void getProjects(ProjectQueryData data) { 

aw ProjectQueryData klasie, mam następujący jako konstruktora

public ProjectQueryData (int start, int end, String field, 
      QuerySortOrder order, Map<String, String> filters) { 

Odpowiedz

10

Ponieważ typem trwałego atrybutu projectNo jest Long, argumentem type podczas tworzenia parametru ParameterExpression powinno być Long.A co za tym idzie, ponieważ typ ParameterExpression jest Long, typ wartości parametru powinna być długa, a także:

//because this persistent Attribute is Long: 
private Long projectNo; 

//we use Long here as well 
ParameterExpression<Long> pexp = cb.parameter(Long.class, "projectNo"); 
... 
//and finally set parameter. Long again, because that is the type 
// type of ParameterExpression: 
query.setParameter("projectNo", Long.valueOf(projectNo)); 
+0

Mikko, dziękuję bardzo, to naprawdę pomogło rozwiązać problem. Bardzo doceniane. – user75ponic

+1

+1 miła robota, wygląda na to, że udało ci się zebrać wszystko razem, aby uzyskać spójną odpowiedź, która zadziałała! –

2

projectNo jest typu long w DAO, więc zmień go na long.

Spróbuj tego:

q.setParameter("projectNo", new Long(projectNo)); 

myślę, że należy zmienić:

ParameterExpression<String> pexp = cb.parameter(Long.class, "projectNo"); 

do

ParameterExpression<String> pexp = cb.parameter(String.class, "projectNo"); 
+0

Próbowałem to jednak ten sam błąd będzie się powtarzał. – user75ponic

+0

Który błąd otrzymujesz – PSR

+0

Następujący błąd 'java.lang.IllegalArgumentException: Niepoprawny typ parametru nazwanego [projectNo]; oczekując [java.lang.String], stwierdzono [java.lang.Long] ' – user75ponic

3

W swojej klasy DAO, otrzymujesz projectNo jako String:

String projectNo = filters.get("projectNo"); 

Jednak w swojej klasie modelu definiuje się jako projectNo jako długą.

Po ustawieniu parametru w DAO na tej linii:

q.setParameter("projectNo", projectNo); // error in this line 

ustawiasz parametr jako ciąg znaków. Spróbuj zmienić tę linię następująco (przy założeniu, że masz zaznaczone projectNo null):

q.setParameter("projectNo", Long.parseLong(projectNo)); 

również prawdopodobnie nie zaszkodzi (programowanie defensywne), aby mieć pewność, że projectNo jest numeryczny przed wywołaniem Long.parseLong. Możesz to zrobić pod numerem Apache Commons StringUtils.isNumeric.

+0

Próbowałem 'Long.parseLong', ale otrzymuję ten sam błąd. – user75ponic

Powiązane problemy