2010-06-17 1 views
4

Мне интересно, возможно ли следующее в 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

+0

Вещь HQL используется для запуска запросов к БД, а не к объектам Java. Поэтому это должно быть каким-то образом переведено на SQL, как бы вы перевели некоторый общий java-метод для SQL? Я бы сказал, что вы должны представлять 'toCanonicalString' в SQL, что-то вроде' from Foo, где CONCAT (foo.bar, foo.something), например, "% baz%" '. И если он не может быть переведен на SQL, то Hibernate также не сможет сделать это автоматически. – serg

+0

Конечно, я искал способ сделать перевод на уровне HQL, если это возможно. (В конце, очевидно, мне придется объяснить функцию HQL) – phtrivier

+0

Вы можете переназначить функции hql для генерации разных sql, например. registerFunction ("подстрока", новый SQLFunctionTemplate (Hibernate.STRING, "подстрока (? 1,? 2,? 3)")); но я не думаю, что вы можете манипулировать свойствами, прежде чем они преобразуются в sql. –

ответ

Смежные вопросы