मुझे एक स्प्रिंग डेटा रिपॉजिटरी के भीतर कच्चे एसक्यूएल का उपयोग करने की आवश्यकता है, क्या यह संभव है? मैं जो कुछ भी देखता हूं @Query
वह हमेशा इकाई आधारित होता है।
मुझे एक स्प्रिंग डेटा रिपॉजिटरी के भीतर कच्चे एसक्यूएल का उपयोग करने की आवश्यकता है, क्या यह संभव है? मैं जो कुछ भी देखता हूं @Query
वह हमेशा इकाई आधारित होता है।
जवाबों:
@Query एनोटेशन देशी नेटिव ध्वज को सही पर सेट करके मूल प्रश्नों को निष्पादित करने की अनुमति देता है।
स्प्रिंग डेटा JPA संदर्भ डॉक्स से उद्धरण ।
इसके अलावा, इस अनुभाग को नामांकित क्वेरी के साथ कैसे करें , यह देखें ।
@Query(value = "SELECT * FROM USERS WHERE EMAIL_ADDRESS = ?1", nativeQuery = true)
हाँ, आप इसे 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
।
अधिक जानकारी इस थ्रेड और इस थ्रेड पर जाएँ
धन्यवाद :)
स्प्रिंग डेटा JDBC रिपॉजिटरी का उपयोग करना भी संभव है , जो JPA का उपयोग किए बिना, कच्चे एसक्यूएल के साथ डेटाबेस तक पहुंचने के लिए स्प्रिंग डेटा कॉमन्स के शीर्ष पर बनाया गया एक सामुदायिक प्रोजेक्ट है।
यह स्प्रिंग डेटा जेपीए की तुलना में कम शक्तिशाली है, लेकिन अगर आप हाइबरनेट जैसे ओआरएम का उपयोग किए बिना सरल परियोजनाओं के लिए हल्के समाधान चाहते हैं, तो यह एक समाधान है।
हम createNativeQuery ("यहां नैगेटिव एसक्यूएल क्वेरी") का उपयोग कर सकते हैं;
उदाहरण के लिए :
Query q = em.createNativeQuery("SELECT a.firstname, a.lastname FROM Author a");
List<Object[]> authors = q.getResultList();
em
चर कैसे बनाया जाए ।
स्प्रिंग रिपॉजिटरी के भीतर कच्ची क्वेरी का उपयोग करना संभव है।
@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);