Mit JPA 2.0 Criteria API und Guss Ursachen erzeugen JPQL in Hibernate zum Scheitern verurteilt
-
28-09-2019 - |
Frage
Ich bin ein Erstnutzer des neuen JPA 2.0 Criteria API und I ‚m in ein Problem laufen, wenn ich ein Nummernfeld String müssen werfen sie mit einem String-Parameter zu vergleichen. Der Grund hierfür ist, dass ich für Teilnummern gesucht werden soll, so dass ich eine ‚wie‘ auf dem CriteriaBuilder verwenden. Hier ist ein Codebeispiel:
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);
}
}
Der wichtigste Teil ist
Predicate parcelNumberIdPredicate = cb.like(
parcelDO.<Long> get("parcelNumberId").as(String.class),
parcelNumberId + "%");
, wo ich verwende, um die Kriterien API, um den Weg in einen Ausdruck für einen ähnliches Verfahren auf dem CriteriaBuilder benötigt konvertieren.
Nun, wenn ich laufe und es führt diesen Code, die zugrunde liegende JPA 2.0-Implementierung Hibernate mit folgenden Ausnahme fehlschlägt:
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]
scheint mir, wie Hibernate generiert eine JPQL, die nicht korrekt ist.
Ich habe keine Ahnung, was falsch ist, können Sie Hilfe?
Ich verwende die neueste Version Hibernate (3.6.0.CR2)
Danke
Lösung 2
Wie axtavt in den Kommentaren in der Frage erwähnt, ist es ein Bug in Hibernate 3.6 http://opensource.atlassian.com/projects/hibernate/browse/HHH-5755
Andere Tipps
Was es JPA kommt, wird Expression.as Verfahren verwendet falschen Zweck in Frage zu dienen. Casting Expression<Number>
zu Expression<String>
soll nicht zur Arbeit über Expression.as . statt falscher JPQL Natürlich wäre es schön, klar Fehlermeldung zu haben.
Wie gesagt in der Dokumentation, führt er Typumwandlung, die andere Konzept als die Umwandlung ist von Typ zu anderen:
Führen Sie eine Typumwandlung auf dem Ausdruck, einen neuen Ausdruck Rückkehr Objekt. Diese Methode funktioniert nicht Ursache Typumwandlung: der Laufzeittyp wird nicht verändert. . Achtung: in einem Laufzeitfehler führen kann