Есть ли у JPA эквивалент Hibernate SQLQuery.addScalar ()? - PullRequest
3 голосов
/ 19 ноября 2010

Мой старый код только для Hibernate использует что-то вроде

session.createSQLQuery("SELECT * FROM CATS")
.addScalar("ID", Hibernate.LONG)
.addScalar("NAME", Hibernate.STRING)
.addScalar("BIRTHDATE", Hibernate.DATE)

В новом проекте мы используем Hibernate EntityManager (реализация JPA).

Есть ли эквивалент этих вызовов addScalar ()? Нужно ли указывать типы возвращаемых столбцов, как я делал раньше?

Например, если я не использую addScalar, будут ли кэшироваться результаты SQL-запроса?

Ответы [ 3 ]

2 голосов
/ 22 июня 2011

Пост Собственный запрос Hibernate - столбец char (3)

, похоже, предлагает аналогичное, более короткое решение, которое мне подходит:

Query q2 = em.createNativeQuery("select sc_cur_code, sc_amount from sector_costs");
q2.unwrap(SQLQuery.class).addScalar("sc_cur_code", StringType.INSTANCE);
2 голосов
/ 27 ноября 2013

Я знаю, что это довольно старый вопрос, просто отвечаю на него, если кто-то еще сталкивается с проблемой

createNativeQuery принимает параметр, который указывает тип класса, в котором получен результат, поэтому в вашем случае вы можете изменить его на

val sql = "select distinct story as story from ...";
Query = getEntityManager().createNativeQuery(sql,Story.class);
1 голос
/ 21 мая 2011

Я искал точно такую ​​же вещь и ничего не мог найти в JPA.

Ух, 6 месяцев и не отвечаю:)

Не знаю, помогает это или нет, но я нашел обходной путь:

Галочка в том, что вы не можете привести непосредственно к SQLQuery, вы должны привести к HibernateQuery, затем вызвать getHibernateQuery, а затем привести результат к SQLQuery.

А теперь для некоторого (scala) кода:

val sql = "select distinct story as story from ...";
val q: Query = getEntityManager().createNativeQuery(sql);
//hello nasty hack
q.asInstanceOf[HibernateQuery].getHibernateQuery().asInstanceOf[SQLQuery].addScalar("story", StandardBasicTypes.LONG);
//next, caching  
q.setHint("org.hibernate.cacheable", true);
q.setHint("org.hibernate.cacheRegion", "query.getTopLinks");

некрасиво, но это делает работу:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...