использование entityManager.createNativeQuery (query, foo.class)

Я хотел бы вернуть список целых чисел из

javax.persistence.EntityManager.createNativeQuery call

Почему следующее неверно?

 entityManager.createNativeQuery("Select P.AppID From P", Integer.class); 

в частности, почему я получаю «… Неизвестный объект: java.lang.Integer»

Должен ли я создать class сущности, который имеет одно поле, которое является целым?

благодаря

То, что вы делаете, называется проекцией . Это когда вы возвращаете только скалярное значение, принадлежащее одному объекту. Вы можете сделать это с помощью JPA. См. Скалярное значение .

Я думаю, что в этом случае вообще невозможно исключить тип сущности:

  Query query = em.createNativeQuery( "select id from users where username = ?"); query.setParameter(1, "lt"); BigDecimal val = (BigDecimal) query.getSingleResult(); 

Пример отсюда .

Это не работает, потому что второй параметр должен быть отображенным объектом и, конечно, Integer не является постоянным classом (поскольку на нем нет annotations @Entity).

для вас вы должны сделать следующее:

 Query q = em.createNativeQuery("select id from users where username = :username"); q.setParameter("username", "lt"); List values = q.getResultList(); 

или если вы хотите использовать HQL, вы можете сделать что-то вроде этого:

 Query q = em.createQuery("select new Integer(id) from users where username = :username"); q.setParameter("username", "lt"); List values = q.getResultList(); 

С уважением.

Вот Хранилища данных DB2, которые получают параметр

SQL

 CREATE PROCEDURE getStateByName (IN StateName VARCHAR(128)) DYNAMIC RESULT SETS 1 P1: BEGIN -- Declare cursor DECLARE State_Cursor CURSOR WITH RETURN for -- ####################################################################### -- # Replace the SQL statement with your statement. -- # Note: Be sure to end statements with the terminator character (usually ';') -- # -- # The example SQL statement SELECT NAME FROM SYSIBM.SYSTABLES -- # returns all names from SYSIBM.SYSTABLES. -- ###################################################################### SELECT * FROM COUNTRY.STATE WHERE PROVINCE_NAME LIKE UPPER(stateName); -- Cursor left open for client application OPEN Province_Cursor; END P1 

Ява

 //Country is a db2 scheme //Now here is a java Entity bean Method public List getStateByName(String stateName) throws Exception { EntityManager em = this.em; List states= null; try { Query query = em.createNativeQuery("call NGB.getStateByName(?1)", Province.class); query.setParameter(1, provinceName); states= (List) query.getResultList(); } catch (Exception ex) { throw ex; } return states; } 

Предположим, что ваш запрос « select id, имя от пользователей, где rollNo = 1001 ».

Здесь запрос возвращает объект с столбцом id и name. Класс Response выглядит так:

 public class UserObject{ int id; String name; String rollNo; public UserObject(Object[] columns) { this.id = (columns[0] != null)?((BigDecimal)columns[0]).intValue():0; this.name = (String) columns[1]; } public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getRollNo() { return rollNo; } public void setRollNo(String rollNo) { this.rollNo = rollNo; } } 

здесь конструктор UserObject получит массив объектов и задает данные с помощью объекта.

 public UserObject(Object[] columns) { this.id = (columns[0] != null)?((BigDecimal)columns[0]).intValue():0; this.name = (String) columns[1]; } 

Функция выполнения запроса выглядит так:

 public UserObject getUserByRoll(EntityManager entityManager,String rollNo) { String queryStr = "select id,name from users where rollNo = ?1"; try { Query query = entityManager.createNativeQuery(queryStr); query.setParameter(1, rollNo); return new UserObject((Object[]) query.getSingleResult()); } catch (Exception e) { e.printStackTrace(); throw e; } } 

Здесь вам нужно импортировать следующие пакеты:

 import javax.persistence.Query; import javax.persistence.EntityManager; 

Теперь ваш основной class, вы должны вызвать эту функцию. Сначала вы должны получить EntityManager и вызвать эту getUserByRoll(EntityManager entityManager,String rollNo) . Процедура вызова приведена ниже:

 @PersistenceContext private EntityManager entityManager; UserObject userObject = getUserByRoll(entityManager,"1001"); 

Теперь у вас есть данные в этом объекте userObject.

Вот Импорт

 import javax.persistence.EntityManager; import javax.persistence.PersistenceContext; 

Заметка:

query.getSingleResult () возвращает массив. Вы должны сохранить позицию столбца и тип данных.

 select id,name from users where rollNo = ?1 

query возвращает массив, и это [0] --> id and [1] -> name .

Для получения дополнительной информации посетите этот ответ

Благодаря 🙂

JPA была разработана для обеспечения автоматического сопоставления объектов и реляционной базы данных. Поскольку Integer не является устойчивым объектом, зачем вам использовать JPA? Простой запрос JDBC будет работать нормально.

  • Коллекция карт JPA из Enums
  • JPA 2.0 аннотация @OrderColumn в Hibernate 3.5
  • В чем разница между контекстом Persistence с областью действия и контекстом Extended Persistence?
  • Как работает FetchMode в Spring Data JPA
  • Как создать метамодель JPA 2.0?
  • JPA @OneToOne с общим ID - Могу ли я сделать это лучше?
  • JPA getSingleResult () или null
  • Может javax.persistence.Query.getResultList () вернуть null?
  • Java - JPA - аннотация @Version
  • Единые DAO и общие методы CRUD (JPA / Hibernate + Spring)
  • Как использовать TomEE с Hibernate
  • Давайте будем гением компьютера.