Возможно ли использовать исходный SQL в репозитории Spring - программирование
Подтвердить что ты не робот

Возможно ли использовать исходный SQL в репозитории Spring

Мне нужно использовать raw SQL в хранилище данных Spring, возможно ли это? Все, что я вижу вокруг @Query, всегда основано на сущности.

4b9b3361

Ответ 1

Аннотация @Query позволяет выполнять собственные запросы, устанавливая флаг nativeQuery в true.

Цитата из справочных документов Spring Data JPA.

Кроме того, см. Этот раздел о том, как это сделать с помощью именованного исходного запроса.

Ответ 2

ДА, Вы можете сделать это следующими способами:

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;
        }
    }

Теперь ваш класс Projection похож на приведенный ниже. Это могут те поля, которые вам нужны.

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 получит массив объектов и установит данные вместе с объектом.

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");

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

Замечания:

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

select id,name from users where roll_no = 1001 

запрос возвращает массив и его [0] --> id and [1] → name.

Больше информации посетите эту тему и эту тему

Спасибо :)

Ответ 3

Также можно использовать Spring репозиторий данных JDBC, который представляет собой проект сообщества, построенный поверх Spring Data Commons to доступ к базам данных с необработанным SQL, без использования JPA.

Он менее мощный, чем Spring Data JPA, но если вы хотите легкое решение для простых проектов, не используя ORM, например Hibernate, это решение стоит попробовать.

Ответ 4

мы можем использовать createNativeQuery ("Здесь Nagitive SQL Query");

например:

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

Ответ 5

Можно использовать необработанный запрос в репозитории 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);