Чи можливо використовувати необроблений SQL у сховищі Spring


112

Мені потрібно використовувати сирий SQL у сховищі даних Spring, чи це можливо? Все, що я бачу навколо @Query, завжди засноване на сутності.



Як я можу це використовувати в сховищі? Або я б не використовував репо, а просто використовував цей об'єкт у межах своєї служби?
Вебнет

Чи використовуєте ви Spring-data-jpa?
zagyi

@Webnet Я трохи новачок Весни сам, але мені здається, ви можете використовувати це як об’єкт
Четтер Хаммін

ви пробували Spring JDBCTemplate?
BlackJoker

Відповіді:


133

Анотація @Query дозволяє виконувати нативні запити, встановивши прапор nativeQuery на істинне.

Цитата з довідкових документів JPA Spring Data .

Також дивіться цей розділ про те, як це зробити за допомогою названого нативного запиту.


13
@ user454322, параметри починаються з 1, так що:@Query(value = "SELECT * FROM USERS WHERE EMAIL_ADDRESS = ?1", nativeQuery = true)
Якоб ван Лінген

nativeQuery = true врятувало мене від IllegalArgumentException
Reza

45

ТАК, Ви можете це зробити нижче:

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.

Більше інформації відвідайте цю тему та цю нитку

Дякую :)


3

Також можна використовувати сховище JDBC Spring Data , що є спільним проектом, побудованим на версії Spring Data Commons для доступу до баз даних із необробленим SQL, не використовуючи JPA.

Він менш потужний, ніж Spring Data JPA, але якщо ви хочете легке рішення для простих проектів без використання ORM типу Hibernate, це рішення варто спробувати.


3

ми можемо використовувати createNativeQuery ("Тут Nagitive SQL Query");

наприклад :

Query q = em.createNativeQuery("SELECT a.firstname, a.lastname FROM Author a");
List<Object[]> authors = q.getResultList();

9
Було б корисно / повно, якщо ви також показали, як створити emзмінну.
ETL

1

Можна використовувати необроблений запит у сховищі 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);
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.