একটি স্প্রিং রিপোজিটরির মধ্যে কাঁচা এসকিউএল ব্যবহার করা কি সম্ভব?


112

একটি স্প্রিং ডেটা সংগ্রহস্থলের মধ্যে আমার কাঁচা এসকিউএল ব্যবহার করা দরকার, এটি কি সম্ভব? আমি প্রায় @Queryযা কিছু দেখি তা সর্বদা সত্তা ভিত্তিক।



আমি কীভাবে এটি কোনও সংগ্রহস্থলের মধ্যে ব্যবহার করতে পারি? বা আমি কি কোনও রেপো ব্যবহার করব না এবং কেবলমাত্র আমার পরিষেবাতে সেই বস্তুটি ব্যবহার করব?
ওয়েবনেট

আপনি কি বসন্ত-ডেটা-জিপিএ ব্যবহার করেন?
zagyi

@ ওয়েবেনেট আমি নিজেই বসন্তের জন্য কিছুটা নতুন, তবে আমার কাছে মনে হচ্ছে আপনি এটি একটি বস্তু হিসাবে ব্যবহার করতে পারবেন
চেটার হুমিন

আপনি কি স্প্রিং জেডিবিসিটিম্প্লেট চেষ্টা করেছেন?
ব্ল্যাকজোকার

উত্তর:


133

@ কিউরি টীকাটি নেটিভ্যু কিওয়ারি পতাকাটিকে সত্যে সেট করে নেটিভ ক্যোয়ারিকে সম্পাদন করতে দেয়।

স্প্রিং ডেটা জেপিএ রেফারেন্স ডক্স থেকে উদ্ধৃতি ।

এছাড়াও, নামী নেটিভ ক্যোয়ারী দিয়ে এটি কীভাবে করা যায় সে সম্পর্কে এই বিভাগটি দেখুন ।


13
@ ব্যবহারকারী 45432222, প্যারামিটারগুলি 1 দিয়ে শুরু হয়, তাই এটি:@Query(value = "SELECT * FROM USERS WHERE EMAIL_ADDRESS = ?1", nativeQuery = true)
জ্যাকব ভ্যান লিনজেন

নেটিকিওওয়ারি = সত্য আমাকে অবৈধআর্গুমেন্টএক্সেপশন থেকে বাঁচিয়েছে
রেজা

45

হ্যাঁ, আপনি প্রশংসনীয় উপায়ে এটি করতে পারেন:

1. ক্রুডেরপোসিটরি দ্বারা (প্রযোজনা)

স্প্রিং ডেটা সংগ্রহস্থলগুলি কোয়েরি পদ্ধতিগুলি ব্যবহার করার সময় সাধারণত ডোমেন মডেলটি ফেরত দেয়। তবে, কখনও কখনও, আপনাকে বিভিন্ন কারণে সেই মডেলটির দৃষ্টিভঙ্গি পরিবর্তন করতে হতে পারে।

মনে করুন আপনার সত্তাটি এর মতো:

    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. সত্ত্বা ম্যানেজার ব্যবহার করে

মনে করুন আপনার ক্যোয়ারীটি " ব্যবহারকারীদের তালিকা থেকে আইডি নির্বাচন করুন যেখানে রোল_নো = 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;
        }
    }

এখানে ইউজারবজেক্ট কনস্ট্রাক্টর একটি অবজেক্ট অ্যারে পাবে এবং অবজেক্টের সাথে ডেটা সেট করবে।

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;

এখন আপনার প্রধান বর্গ, আপনি এই ফাংশন কল করতে হবে। প্রথমে সত্ত্বা ম্যানেজারটি পান এবং এই getUserByRoll(EntityManager entityManager,String rollNo)ফাংশনটি কল করুন । কলিং পদ্ধতিটি দেওয়া হল:

এখানে আমদানি

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

EntityManagerএই উপায় থেকে পেতে :

@PersistenceContext
private EntityManager entityManager;

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

এখন এই ইউজারবজেক্টে আপনার ডেটা রয়েছে।

বিঃদ্রঃ:

ক্যোয়ারী.সেটসিলারেলসাল্ট () একটি অবজেক্ট অ্যারে প্রদান করে। আপনার ক্যোয়ারী কলাম অবস্থানের সাথে কলামের অবস্থান এবং ডেটা টাইপ বজায় রাখতে হবে।

select id,name from users where roll_no = 1001 

ক্যোয়ারী একটি অ্যারের ফিরিয়ে দেয় এবং এটি [0] --> id and [1] -> name

আরও তথ্য এই থ্রেড এবং এই থ্রেড দেখুন

ধন্যবাদ :)


3

স্প্রিং ডেটা জেডিবিসি সংগ্রহস্থল ব্যবহার করাও সম্ভব , যা জেপিএ ব্যবহার না করে কাঁচা এসকিউএল সহ ডাটাবেসে অ্যাক্সেসের জন্য স্প্রিং ডেটা কমন্সের শীর্ষে নির্মিত একটি সম্প্রদায় প্রকল্প।

এটি স্প্রিং ডেটা জেপিএর চেয়ে কম শক্তিশালী তবে আপনি যদি হাইবারনেটের মতো কোনও ওআরএম ব্যবহার না করে সাধারণ প্রকল্পগুলির জন্য হালকা ওজনের সমাধান চান তবে এটি সমাধানের চেষ্টা করার মতো।


3

আমরা createNativeQuery ("এখানে নাগিটিভ এসকিউএল কোয়েরি") ব্যবহার করতে পারি;

উদাহরণ স্বরূপ :

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

9
আপনি কীভাবে emভেরিয়েবলটি তৈরি করবেন তাও দেখিয়ে দিলে দরকারী / সম্পূর্ণ হবে ।
ETL

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);
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.