Mit JPA 2.0 Criteria-API und cast Ursachen erzeugt JPQL, um nicht in den Ruhezustand
Ich bin eine erste Zeit Benutzer der neuen JPA-2.0-Kriterien-API und ich 'm laufen in ein problem, wenn ich brauche zu werfen auf das Feld Nummer String-vergleichen Sie es mit einem String-parameter. Grund ist, dass ich suchen will, teilweise zahlen, so dass ich mit einem 'like' auf der CriteriaBuilder. Hier ein code-Beispiel:
CriteriaBuilder cb = getEntityManager().getCriteriaBuilder();
CriteriaQuery<ParcelDO> cq = cb.createQuery(ParcelDO.class);
Root<ParcelDO> parcelDO = cq.from(ParcelDO.class);
cq.select(parcelDO);
String parcelNumberId = parcelSearchDetailDO.getParcelNumberId();
if (parcelNumberId != null && !parcelNumberId.isEmpty()) {
Predicate parcelNumberIdPredicate = cb.like(
parcelDO.<Long> get("parcelNumberId").as(String.class),
parcelNumberId + "%");
if (cq.getRestriction() != null) {
cq.where(cq.getRestriction(), parcelNumberIdPredicate);
} else {
cq.where(parcelNumberIdPredicate);
}
}
Ist der wichtige Teil
Predicate parcelNumberIdPredicate = cb.like(
parcelDO.<Long> get("parcelNumberId").as(String.class),
parcelNumberId + "%");
wo ich die Kriterien API zum konvertieren des Pfads in einen Ausdruck gebraucht für die like-Methode auf die CriteriaBuilder.
Wenn ich jetzt ausführen, und dieser code ausgeführt, der zugrunde liegenden JPA 2.0 Implementierung Hibernate fehlschlägt, mit der folgenden Ausnahme:
Caused by: org.hibernate.hql.ast.QuerySyntaxException:
expecting CLOSE, found '(' near line 1, column 117
[select generatedAlias0 from domain.ParcelDO as generatedAlias0 where
cast(generatedAlias0.parcelNumberId as varchar2(255 char)) like :param0]
Sieht für mich wie Hibernate ist die Erzeugung eines JPQL, dass ist nicht korrekt.
Ich habe keine Ahnung, was falsch ist, können Sie helfen?
Ich benutze die neueste Hibernate-version (3.6.0.CR2)
Danke
- Es ist ein bug, habe ich davon berichtet: opensource.atlassian.com/projects/hibernate/browse/HHH-5755
- axtavt, danke. Haben Sie fand einen workaround noch?
- die lattest hibernate-entitymanager (release -) version ist 3.6.0.Endgültig.
- Dank becomputer06, du hast Recht. Leider das gleiche problem, obwohl
Du musst angemeldet sein, um einen Kommentar abzugeben.
Was es zu JPA, Ausdruck.als Methode wird verwendet, um zu dienen, der Unrecht Zweck in Frage. Casting
Expression<Number>
zuExpression<String>
soll nicht die Arbeit über Ausdruck.als. Natürlich wäre es schön, klare Fehlermeldung, statt falsche JPQL.Wie gesagt in der Dokumentation, es führt eine Typumwandlung, die anderes Konzept als die Konvertierung von einem Typ zum anderen:
Als axtavt angegeben, ist in den Kommentaren in der Frage, es ist ein bug in Hibernate 3.6 http://opensource.atlassian.com/projects/hibernate/browse/HHH-5755