Мне интересно, возможно ли следующее в Hibernate; при написании запроса HQL, вы можете сказать что-то вродеМожно ли переопределить оператор Hibernate «как» в HQL?
select foo from Foo where foo.barString like "%baz%"
Это работает в предположении, что класс Foo имеет атрибут типа String с именем barString.
Теперь предположим, что Foo как атрибут bar типа Bar, но этот Bar имеет хорошо известное каноническое строковое представление. Предположим, что это то, что можно легко и быстро вычислить (скажем, путем конкатенации), но это не, хранящееся в БД. Есть ли способ, чтобы отобразить/изменить класс, так что вы можете написать что-то вроде либо
select foo from Foo where foo.bar like "%baz%"
или
select foo from Foo where foo.bar.toCanonicalString like "%baz%"
или даже
select foo from Foo where toCanonicalString(foo.bar) like "%baz%"
?
Благодаря PH
Вещь HQL используется для запуска запросов к БД, а не к объектам Java. Поэтому это должно быть каким-то образом переведено на SQL, как бы вы перевели некоторый общий java-метод для SQL? Я бы сказал, что вы должны представлять 'toCanonicalString' в SQL, что-то вроде' from Foo, где CONCAT (foo.bar, foo.something), например, "% baz%" '. И если он не может быть переведен на SQL, то Hibernate также не сможет сделать это автоматически. – serg
Конечно, я искал способ сделать перевод на уровне HQL, если это возможно. (В конце, очевидно, мне придется объяснить функцию HQL) – phtrivier
Вы можете переназначить функции hql для генерации разных sql, например. registerFunction ("подстрока", новый SQLFunctionTemplate (Hibernate.STRING, "подстрока (? 1,? 2,? 3)")); но я не думаю, что вы можете манипулировать свойствами, прежде чем они преобразуются в sql. –