是否可以在Spring存储库中使用原始SQL

2022-08-31 08:02:19

我需要在Spring Data Repository中使用原始SQL,这可能吗?我周围看到的一切都是基于实体的。@Query


答案 1

@Query注释允许通过将 nativeQuery 标志设置为 true 来执行本机查询。

引自Spring Data JPA参考文档

另请参阅本节,了解如何使用命名的本机查询执行此操作。


答案 2

是的,您可以通过以下方式执行此操作:

1. 按 CrudRepository (Projection)

Spring Data 存储库在使用查询方法时通常会返回域模型。但是,有时,由于各种原因,您可能需要更改该模型的视图。

假设你的实体是这样的:

    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. 使用实体管理器

假设您的查询是“从roll_no = 1001 的用户中选择 id,name”。

此处的查询将返回一个包含 id 和 name 列的对象。您的响应类就像波纹管一样:

您的响应类如下所示:

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

在这里,用户对象构造函数将获得一个对象数组并与对象一起设置数据。

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

更多信息请访问此线程此线程

谢谢:)


推荐