क्या स्प्रिंग रिपॉजिटरी के भीतर कच्चे एसक्यूएल का उपयोग करना संभव है


112

मुझे एक स्प्रिंग डेटा रिपॉजिटरी के भीतर कच्चे एसक्यूएल का उपयोग करने की आवश्यकता है, क्या यह संभव है? मैं जो कुछ भी देखता हूं @Queryवह हमेशा इकाई आधारित होता है।



मैं उस भंडार का उपयोग कैसे कर सकता हूं? या मैं एक रेपो का उपयोग नहीं करूंगा और सिर्फ अपनी सेवा के भीतर ही उस वस्तु का उपयोग करूंगा?
वेबनेट

क्या आप स्प्रिंग-डेटा-जपा का उपयोग करते हैं?
झगिी

@Webnet मैं खुद स्प्रिंग के लिए थोड़ा नया हूं, लेकिन यह मुझे दिखता है कि आप इसे एक वस्तु के रूप में इस्तेमाल कर सकते हैं
चेट्टर हमीं

क्या आपने स्प्रिंग JDBCTemplate की कोशिश की है?
ब्लैकजोकर

जवाबों:


133

@Query एनोटेशन देशी नेटिव ध्वज को सही पर सेट करके मूल प्रश्नों को निष्पादित करने की अनुमति देता है।

स्प्रिंग डेटा JPA संदर्भ डॉक्स से उद्धरण ।

इसके अलावा, इस अनुभाग को नामांकित क्वेरी के साथ कैसे करें , यह देखें ।


13
@ user454322, पैरामीटर 1 से शुरू होता है, इसलिए यह है:@Query(value = "SELECT * FROM USERS WHERE EMAIL_ADDRESS = ?1", nativeQuery = true)
जैकब वैन लिंगन

nativeQuery = सच ने मुझे IllegalArgumentException
Reza

45

हाँ, आप इसे bellow तरीकों से कर सकते हैं:

1. CrudRepository (प्रोजेक्शन) द्वारा

स्प्रिंग डेटा रिपॉजिटरी आमतौर पर क्वेरी के तरीकों का उपयोग करते समय डोमेन मॉडल लौटाते हैं। हालांकि, कभी-कभी, आपको विभिन्न कारणों से उस मॉडल के दृष्टिकोण को बदलने की आवश्यकता हो सकती है।

मान लीजिए कि आपकी इकाई इस प्रकार है:

    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. EntityManager का उपयोग करना

मान लें कि आपकी क्वेरी " सेलेक्ट आईडी, नाम उन यूजर्स से है जहां रोल_नो = 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];
        }

आपका क्वेरी निष्पादन कार्य bellow की तरह है:

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

यहाँ आपको bellow पैकेज आयात करने होंगे:

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

स्प्रिंग डेटा JDBC रिपॉजिटरी का उपयोग करना भी संभव है , जो JPA का उपयोग किए बिना, कच्चे एसक्यूएल के साथ डेटाबेस तक पहुंचने के लिए स्प्रिंग डेटा कॉमन्स के शीर्ष पर बनाया गया एक सामुदायिक प्रोजेक्ट है।

यह स्प्रिंग डेटा जेपीए की तुलना में कम शक्तिशाली है, लेकिन अगर आप हाइबरनेट जैसे ओआरएम का उपयोग किए बिना सरल परियोजनाओं के लिए हल्के समाधान चाहते हैं, तो यह एक समाधान है।


3

हम createNativeQuery ("यहां नैगेटिव एसक्यूएल क्वेरी") का उपयोग कर सकते हैं;

उदाहरण के लिए :

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

9
उपयोगी / पूरा होगा यदि आपने यह भी दिखाया कि emचर कैसे बनाया जाए ।
ईटीएल

1

स्प्रिंग रिपॉजिटरी के भीतर कच्ची क्वेरी का उपयोग करना संभव है।

      @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);
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.