Có thể sử dụng SQL thô trong Kho lưu trữ mùa xuân không


112

Tôi cần sử dụng SQL thô trong Kho lưu trữ dữ liệu mùa xuân, điều này có khả thi không? Mọi thứ tôi thấy xung quanh @Queryluôn dựa trên thực thể.



Làm thế nào tôi có thể sử dụng nó trong một kho lưu trữ? Hay tôi sẽ không sử dụng repo và chỉ sử dụng đối tượng đó trong dịch vụ của mình?
Webnet

Bạn có sử dụng spring-data-jpa không?
zagyi

@Webnet Tôi là một chút mới đến mùa xuân bản thân mình, nhưng có vẻ với tôi rằng bạn có thể sử dụng như là một đối tượng
Chetter Hummin

bạn đã thử Spring JDBCTemplate chưa?
BlackJoker

Câu trả lời:


133

Chú thích @Query cho phép thực thi các truy vấn gốc bằng cách đặt cờ nativeQuery thành true.

Trích dẫn từ tài liệu tham khảo Spring Data JPA .

Ngoài ra, hãy xem phần này về cách thực hiện với truy vấn gốc được đặt tên.


13
@ user454322, các tham số bắt đầu bằng 1, vì vậy nó là:@Query(value = "SELECT * FROM USERS WHERE EMAIL_ADDRESS = ?1", nativeQuery = true)
Jacob van Lingen

nativeQuery = true đã cứu tôi khỏi IllegalArgumentException
Reza

45

CÓ, Bạn có thể thực hiện việc này theo những cách sau:

1. Bởi CrudRepository (Projection)

Kho lưu trữ Dữ liệu Mùa xuân thường trả về mô hình miền khi sử dụng các phương pháp truy vấn. Tuy nhiên, đôi khi, bạn có thể cần phải thay đổi chế độ xem của mô hình đó vì nhiều lý do khác nhau.

Giả sử thực thể của bạn giống như sau:

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

Bây giờ lớp Projection của bạn giống như dưới đây. Nó có thể những trường mà bạn cần.

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

Bây giờ ArrayList<IUserProjection> findUserUsingRollNo(String rollNo)sẽ cung cấp cho bạn danh sách người dùng.

2. Sử dụng EntityManager

Giả sử truy vấn của bạn là " chọn id, tên từ những người dùng mà roll_no = 1001 ".

Ở đây truy vấn sẽ trả về một đối tượng có id và cột tên. Lớp Phản hồi của bạn giống như dưới đây:

Lớp Phản hồi của bạn giống như:

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

ở đây hàm khởi tạo UserObject sẽ lấy một Mảng đối tượng và thiết lập dữ liệu với đối tượng.

public UserObject(Object[] columns) {
            this.id = (columns[0] != null)?((BigDecimal)columns[0]).intValue():0;
            this.name = (String) columns[1];
        }

Hàm thực thi truy vấn của bạn giống như dưới đây:

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

Ở đây bạn phải nhập các gói dưới đây:

import javax.persistence.Query;
import javax.persistence.EntityManager;

Bây giờ lớp chính của bạn, bạn phải gọi hàm này. Đầu tiên hãy lấy EntityManager và gọi getUserByRoll(EntityManager entityManager,String rollNo)hàm này . Thủ tục gọi điện được đưa ra dưới đây:

Đây là nhập khẩu

import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;

nhận được EntityManagertừ cách này:

@PersistenceContext
private EntityManager entityManager;

UserObject userObject = getUserByRoll(entityManager,"1001");

Bây giờ bạn có dữ liệu trong userObject này.

Ghi chú:

query.getSingleResult () trả về một mảng đối tượng. Bạn phải duy trì vị trí cột và kiểu dữ liệu với vị trí cột truy vấn.

select id,name from users where roll_no = 1001 

truy vấn trả về một mảng và nó [0] --> id and [1] -> name.

Thêm thông tin truy cập chuỗi nàychuỗi này

Cảm ơn :)


3

Cũng có thể sử dụng kho lưu trữ JDBC của Spring Data , đây là một dự án cộng đồng được xây dựng trên Spring Data Commons để truy cập vào cơ sở dữ liệu bằng SQL thô mà không cần sử dụng JPA.

Nó kém mạnh mẽ hơn Spring Data JPA, nhưng nếu bạn muốn giải pháp nhẹ cho các dự án đơn giản mà không sử dụng ORM như Hibernate, thì đó là một giải pháp đáng để thử.


3

chúng ta có thể sử dụng createNativeQuery ("Đây là Truy vấn SQL Nagitive");

ví dụ :

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

9
Sẽ hữu ích / đầy đủ nếu bạn cũng chỉ ra cách tạo embiến.
ETL

1

Có thể sử dụng truy vấn thô trong Kho lưu trữ mùa xuân.

      @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);
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.