Мені потрібно використовувати сирий SQL у сховищі даних Spring, чи це можливо? Все, що я бачу навколо @Query
, завжди засноване на сутності.
Мені потрібно використовувати сирий SQL у сховищі даних Spring, чи це можливо? Все, що я бачу навколо @Query
, завжди засноване на сутності.
Відповіді:
Анотація @Query дозволяє виконувати нативні запити, встановивши прапор nativeQuery на істинне.
Цитата з довідкових документів JPA Spring Data .
Також дивіться цей розділ про те, як це зробити за допомогою названого нативного запиту.
@Query(value = "SELECT * FROM USERS WHERE EMAIL_ADDRESS = ?1", nativeQuery = true)
ТАК, Ви можете це зробити нижче:
1. За CrudRepository (Проекція)
Весняні сховища даних зазвичай повертають модель домену при використанні методів запитів. Однак іноді вам може знадобитися змінити погляд на цю модель з різних причин.
Припустимо, ваша організація така:
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
Припустимо, ваш запит - " Виберіть ідентифікатор, ім'я від користувачів, де 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 отримає Object Array і встановить дані з об'єктом.
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 і викликайте цю getUserByRoll(EntityManager entityManager,String rollNo)
функцію. Процедура виклику надається нижче:
Ось імпорт
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
дістатися EntityManager
таким чином:
@PersistenceContext
private EntityManager entityManager;
UserObject userObject = getUserByRoll(entityManager,"1001");
Тепер у вас є дані в цьому користувальницькому об’єкті.
Примітка:
query.getSingleResult () повертає масив об'єктів. Ви повинні підтримувати положення та тип стовпця та тип даних із позицією стовпця запиту.
select id,name from users where roll_no = 1001
запит повертає масив, і це [0] --> id and [1] -> name
.
Більше інформації відвідайте цю тему та цю нитку
Дякую :)
Також можна використовувати сховище JDBC Spring Data , що є спільним проектом, побудованим на версії 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();
em
змінну.
Можна використовувати необроблений запит у сховищі Spring.
@Query(value = "SELECT A.IS_MUTUAL_AID FROM planex AS A
INNER JOIN planex_rel AS B ON A.PLANEX_ID=B.PLANEX_ID
WHERE B.GOOD_ID = :goodId",nativeQuery = true)
Boolean mutualAidFlag(@Param("goodId")Integer goodId);