Можно ли использовать сырой SQL в репозитории Spring

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

72 голоса | спросил Webnet 11 PMpThu, 11 Apr 2013 16:28:09 +040028Thursday 2013, 16:28:09

4 ответа


0
  

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

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

Также см. этот раздел о том, как это сделать с помощью именованного собственного запроса.

ответил zagyi 11 PMpThu, 11 Apr 2013 16:38:16 +040038Thursday 2013, 16:38:16
0

Этого можно добиться следующими способами:

1. По CrudRepository (Проекция)

Spring Data Repositories обычно возвращают модель домена при использовании методов запроса. Однако иногда вам может понадобиться изменить представление об этой модели по разным причинам.

Предположим, что ваша сущность такая:

    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.

Дополнительную информацию можно найти в этой теме и эта тема

Спасибо:)

ответил Md. Sajedul Karim 16 Mayam18 2018, 11:08:57
0

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

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

ответил Sébastien Deleuze 13 Maypm16 2016, 17:01:44
0

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

для примера:

Query q = em.createNativeQuery("SELECT a.firstname, a.lastname FROM Author a");
List<Object[]> authors = q.getResultList();
ответил Lova Chittumuri 17 Jpm1000000pmWed, 17 Jan 2018 13:05:06 +030018 2018, 13:05:06

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132