4 ответов:
аннотация @Query позволяет выполнять собственные запросы, установив флаг nativeQuery в true.
цитата из весенних данных JPA справочные документы.
Также см. в этом разделе о том, как это сделать с именованным собственным запросом.
вы можете достичь этого на ниже пути:
1. По CrudRepository (Проекции)
хранилища данных Spring обычно возвращают модель домена при использовании методов запроса. Однако иногда может потребоваться изменить представление этой модели по различным причинам.
предположим, что ваша сущность является такой :
import javax.persistence.*; import java.math.BigDecimal; @Entity @Table(name = "USER_INFO_TEST") public class UserInfoTest { private int id; private String name; private String rollNo; public UserInfoTest() { } public UserInfoTest(int id, String name) { this.id = id; this.name = name; } @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "ID", nullable = false, precision = 0) public int getId() { return id; } public void setId(int id) { this.id = id; } @Basic @Column(name = "name", nullable = true) public String getName() { return name; } public void setName(String name) { this.name = name; } @Basic @Column(name = "roll_no", nullable = true) public String getRollNo() { return rollNo; } public void setRollNo(String rollNo) { this.rollNo = rollNo; } }теперь ваш класс проекции, как ниже. Это могут те поля, которые вы необходимый.
public interface IUserProjection { int getId(); String getName(); String getRollNo(); }и
Your Data Access Object(Dao) is like bellow:import org.springframework.data.jpa.repository.Query; import org.springframework.data.repository.CrudRepository; import java.util.ArrayList; public interface UserInfoTestDao extends CrudRepository<UserInfoTest,Integer> { @Query(value = "select id,name,roll_no from USER_INFO_TEST where rollNo = ?1", nativeQuery = true) ArrayList<IUserProjection> findUserUsingRollNo(String rollNo); }теперь
ArrayList<IUserProjection> findUserUsingRollNo(String rollNo)даст вам список пользователей.2. С Помощью Метода EntityManager
Предположим ваш запрос "выберите id, имя от пользователей, где roll_no = 1001".
здесь запрос вернет объект с идентификатором и именем столбца. Ваш класс ответа, как показано ниже:
ваш класс ответ например:
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 roll_no = ?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;теперь ваш основной класс, вы должны вызвать эту функцию. Сначала получить EntityManager и вызвать это
также можно использовать Spring Data JDBC repository, который представляет собой проект сообщества, построенный на основе Spring Data Commons Для доступа к базам данных с необработанным SQL, без использования JPA.
Он менее мощный, чем Spring Data JPA, но если вы хотите легкое решение для простых проектов без использования ORM, такого как Hibernate, это решение стоит попробовать.
мы можем использовать createNativeQuery ("здесь Nagitive SQL Query");
например :
Query q = em.createNativeQuery("SELECT a.firstname, a.lastname FROM Author a"); List<Object[]> authors = q.getResultList();
Comments