Другая база данных, другой тип результата с «SELECT 1» над jdbc: как проверить значение?

Я работаю над проектом, который использует JPA (Hibernate), поэтому почти все запросы написаны на JPQL. Но для запроса мне нужно перейти к конкретному типу базы данных, поэтому я написал собственный запрос.

Фактически проект тестируется как с СУБД MySQL, так и с СУБД Oracle. Мой родной запрос — это "SELECT 1 FROM [...]"; Затем мне нужно знать, существует ли результат (легко) и равен ли он 1 (вы можете возразить, что это излишне, я думаю :-)).

В обоих случаях я создаю javax.persistence.Query с createNativeQuery(String) и запускаю запрос следующим образом: Object r = q.getSingleResult(); (об исключениях уже позаботились).
Я обнаружил, что в MySQL r — это BigInteger, а в Oracle — класса BigDecimal.

Я хорошо разбираюсь в JDBC, есть ли способ (изменение запроса, объектов или вызовов методов, которые я использую), чтобы я мог быть уверен, что мой запрос вернет тот же тип данных независимо от того, с чем работает система базы данных? ? Это то, что можно настроить, это зависит от jdbc или проблема связана с драйвером?


person watery    schedule 21.01.2014    source источник


Ответы (1)


И BigInteger, и BigDecimal являются подклассами Number. Итак, просто приведите к общему супертипу и используйте его методы для приведения к примитивному типу, такому как int.

Number r = (Number) q.getSingleResult();
boolean isOne = (r.intValue() == 1);

Hibernate также имеет очень полезный addScalar. Ознакомьтесь с главой 18 его документации для получения дополнительной информации.

Если вы решите использовать это решение, имейте в виду, что это означает развертывание вашего слоя JPA и использование API конкретного поставщика:

Session session = entityManager.unwrap(Session.class);
Integer r = (Integer) session.createSQLQuery("SELECT 1 AS one FROM [...]")
   .addScalar("one", IntegerType.INSTANCE)
   .uniqueResult();

Наконец, JPA имеет собственную аннотацию SqlResultSetMapping. С его помощью вы можете обернуть свои собственные результаты в Entity. Поставщики JPA сделают все возможное, чтобы привести каждый столбец базы данных к соответствующему типу поля сущности. Тем не менее, для скалярных значений это слишком много накладных расходов (я бы выбрал первое решение).

person Anthony Accioly    schedule 21.01.2014
comment
Благодарю вас! Иногда я просто забываю об ООП :-) - person watery; 21.01.2014