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


112

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



リポジトリ内でそれをどのように使用できますか?または、リポジトリを使用せず、サービス内でそのオブジェクトを使用するだけですか?
Webnet 2013

spring-data-jpaを使用していますか?
zagyi 2013

@Webnet私自身、Springは初めてですが、それをオブジェクトとして使用できるようです
Chetter Hummin

あなたはSpring JDBCTemplateを試しましたか?
BlackJoker 2013

回答:


133

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

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

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


13
:それはですので、@ user454322、パラメータは、1で始まる@Query(value = "SELECT * FROM USERS WHERE EMAIL_ADDRESS = ?1", nativeQuery = true)
ヤコブ・ファン・リンゲン

nativeQuery = trueはIllegalArgumentExceptionから私を救いました
Reza

45

はい、これは次の方法で実行できます。

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 where roll_no = 1001」であるとします。

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

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

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 Data JDBCリポジトリを使用することも可能です JPAを使用せず、生のSQLとデータベースへのアクセスに春データ・コモンズの上に構築されたコミュニティプロジェクトです。

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


3

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

例えば ​​:

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

9
em変数の作成方法も示した場合は、便利/完全でしょう。
ETL

1

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);
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.