2017-02-01 3 views
0

Ich arbeite mit einer Legacy-Datenbank und verwende Spring-Daten-JPA für den Repository-Zugriff. Eine der Tabellen hat eine ID-Spalte mit dem Datentyp number, aber die Anforderung besteht darin, eine teilweise Übereinstimmung mit einem Platzhalterzeichen durchführen zu können. So sollte 12 1234. übereinstimmen Wenn ich nativen Abfrage schreibe, kann ichSo vermeiden Sie die Typkonvertierung für Teilübereinstimmungen in nummerbasierten Spalten

select * from table where id like 12%

tun, aber wenn der Frühling JPA Criteria API verwenden, die Sicherheit bietet Typ, ich habe eine Typumwandlung zu tun, bevor ich wie nutzen könnten Betreiber

cb.like(root.get(SomeEntity_.id).as(String.class), str + "%") 

Beachten Sie, dass ich die .as hinzufügen müssen (String.class) der Lage sein, einen String Match mit like Operator durchzuführen. Daraus ergibt sich eine Datentypumwandlung und die Abfrage ist nicht in der Lage von ID-Index

cast(table0_1_.id as varchar(255)) like ?

Ist profitieren es eine Möglichkeit, wie Spiel für diese Nummer basierend Spalte durchzuführen, ohne die Typumwandlung durchführen zu müssen?

Antwort

0

Ich möchte nur darauf hinweisen, dass die Anwendung einer LIKE Operation für einen numerischen Datentyp kann unvorhersehbare Ergebnisse haben, siehe Reference für eine Warnung für SQL Server. Die andere Sache, die zu beachten ist, ist, dass die Datenbank manchmal eine In-Place-Zwangsumsetzung von Werten durchführt, wenn sich die Datentypen unterscheiden oder wenn eine bestimmte Operation spezifische Datentypanforderungen mit sich bringt.

Also, auch wenn Sie id LIKE 12% schreiben, welchen Beweis haben Sie intern, dass nicht zu CAST(id as VARCHAR(255)) LIKE '12%' gezwungen wird?

Aber speziell auf Ihre Frage zu beantworten, zeigt die JPA CriteriaBuilder Klasse nicht ausdrücklich, dass, wenn Sie einen like() Betrieb verwenden wollen, muss die Expression von String Datentyp sein. Sie müssen es also entweder so darstellen, wie es in Ihrem Beitrag dargestellt wird, oder sicherstellen, dass die Spalte bereits diesen Typ aufweist.

+0

Sinn macht. Danke für den Hinweis. – adeelmahmood

Verwandte Themen