web-dev-qa-db-ja.com

Springリポジトリ内で生のSQLを使用することは可能ですか?

Spring Data Repository内で生のSQLを使用する必要がありますが、これは可能ですか? @Queryの周りにあるものはすべて、常にエンティティベースです。

82
Webnet

@Queryアノテーションを使用すると、nativeQueryフラグをtrueに設定してネイティブクエリを実行できます。

Spring Data JPAからの引用 リファレンスドキュメント

また、名前付きネイティブクエリを使用して行う方法については このセクション を参照してください。

116
zagyi

以下の方法でこれを達成できます。

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の使用

クエリが「select id、name from users from roll_no = 1001」であるとします。

ここで、クエリはIDと名前の列を持つオブジェクトを返します。応答クラスは次のようなものです。

応答クラスは次のようなものです:

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です。

詳細はこちらをご覧ください thread および this Thread

ありがとう:)

22

createNativeQuery( "Here Nagitive SQL Query");を使用できます。

例えば ​​:

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

Spring Data JDBC repository を使用することもできます。これは、Spring Data Commonsの上に構築されたコミュニティプロジェクトで、JPAを使用せずに生のSQLでデータベースにアクセスします。

Spring Data JPAほど強力ではありませんが、HibernateのようなORMを使用せずに単純なプロジェクト用の軽量ソリューションが必要な場合は、試してみる価値があります。

3

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);
0
Abdur Rahman