2014-12-22 2 views
8

У меня есть база данных PostgreSQL с полями JSON. Я хотел бы построить запрос, который ограничивает результаты выражениями JSON. Я могу сформулировать этот запрос в PSQL без проблем:JPA2/Hibernate Критерии или критерииQuery для Postgres Тип JSON

select * from mytable where relation_id=100 AND CAST(jsonField->'key' AS float) >= 10.0; 

Этот запрос объединяет в себе обычный столбец и столбец JSON.

Я понятия не имею, как запустить это в Hibernate с использованием запроса Criteria или Criteria. Теоретически я мог бы использовать язык HSQL, но я почти уверен, что это произойдет, когда дело доходит до колонки JSON.

У кого-нибудь есть идея, как справиться с этим?

+1

Вы должны будете использовать собственные запросы, если вы не готовы написать расширение гибернации, добавляющий типы JSON и операторов API Критерии и/или HQL. Это цена, которую вы платите за использование ORM - это удобно, пока вы не захотите делать что-либо интересное и вне самого низкого общего знаменателя функциональности базы данных. –

+0

Любые новости по этой теме? – giaffa86

+0

К сожалению, нет. –

ответ

1

Единственный способ сделать это - написать пользовательское значение SQLFunction для выражения CAST(jsonField->'key' AS float), а затем использовать его в JPQL.

public String render(Type firstArgumentType, List args, SessionFactoryImplementor factory) throws QueryException { 
    return "CAST(" + args.get(0).toString() + "->'" + args.get(1).toString() + "' AS float)"; 
} 

Регистрация на диалекте с registerFunction("json_float", new JsonFloatFunction()) и использовать его в запросе, как

SELECT o FROM MyTable o WHERE o.relation.id = 100 AND JSON_FLOAT(o.jsonField, 'key') >= 10.0 
Смежные вопросы