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

War es hilfreich?

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

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top