আমি সমস্ত ডাটাবেস ক্রিয়াকলাপ সম্পাদন করতে স্প্রিং জেপিএ ব্যবহার করছি। তবে আমি জানি না কীভাবে স্প্রিং জেপিএতে কোনও টেবিল থেকে নির্দিষ্ট কলামগুলি নির্বাচন করতে হয়?
উদাহরণ স্বরূপ:
SELECT projectId, projectName FROM projects
আমি সমস্ত ডাটাবেস ক্রিয়াকলাপ সম্পাদন করতে স্প্রিং জেপিএ ব্যবহার করছি। তবে আমি জানি না কীভাবে স্প্রিং জেপিএতে কোনও টেবিল থেকে নির্দিষ্ট কলামগুলি নির্বাচন করতে হয়?
উদাহরণ স্বরূপ:
SELECT projectId, projectName FROM projects
উত্তর:
আপনি সেট করতে পারেন nativeQuery = true
মধ্যে @Query
A থেকে টীকা Repository
ভালো শ্রেণী:
public static final String FIND_PROJECTS = "SELECT projectId, projectName FROM projects";
@Query(value = FIND_PROJECTS, nativeQuery = true)
public List<Object[]> findProjects();
মনে রাখবেন যে আপনাকে নিজেরাই ম্যাপিং করতে হবে। আপনার যদি কেবলমাত্র এই দুটি মানের প্রয়োজন না হয় তবে কেবল নিয়মিত ম্যাপযুক্ত চেহারাটি ব্যবহার করা সম্ভবত এটির পক্ষে সহজ:
public List<Project> findAll()
স্প্রিং ডেটা ডক্সগুলিও সম্ভবত এটি মূল্যবান ।
FIND_PROJECTS
) গুণাবলীর সাথে যোগ্যতা অর্জন করতে value
হয়েছিল (অতএব এটি যদি আমার কোড হয় তবে আমি এটি @Query(value = FIND_PROJECTS, nativeQuery = true)
আপনি স্প্রিং ডেটা জেপিএ (ডক) থেকে অনুমানগুলি ব্যবহার করতে পারেন । আপনার ক্ষেত্রে, ইন্টারফেস তৈরি করুন:
interface ProjectIdAndName{
String getId();
String getName();
}
এবং আপনার ভাণ্ডারে নিম্নলিখিত পদ্ধতি যুক্ত করুন
List<ProjectIdAndName> findAll();
আমি সিনট্যাক্সটি বিশেষত পছন্দ করি না (এটি দেখতে কিছুটা হ্যাকি লাগছে ...) তবে এটি সর্বাধিক মার্জিত সমাধান যা আমি সন্ধান করতে পেরেছিলাম (এটি জেপিএ সংগ্রহস্থল শ্রেণিতে একটি কাস্টম জেপিকিউএল কোয়েরি ব্যবহার করে):
@Query("select new com.foo.bar.entity.Document(d.docId, d.filename) from Document d where d.filterCol = ?1")
List<Document> findDocumentsForListing(String filterValue);
তবে অবশ্যই, আপনাকে কেবল কনস্ট্রাক্টর সরবরাহ করতে হবে Document
যা গ্রহণ করে docId
এবং filename
কনস্ট্রাক্টর আরগ হিসাবে।
আমার পরিস্থিতিতে আমার কেবল জসন ফলাফল প্রয়োজন এবং এটি আমার পক্ষে কাজ করে:
public interface SchoolRepository extends JpaRepository<School,Integer> {
@Query("select s.id, s.name from School s")
List<Object> getSchoolIdAndName();
}
নিয়ামক মধ্যে:
@Autowired
private SchoolRepository schoolRepository;
@ResponseBody
@RequestMapping("getschoolidandname.do")
public List<Object> getSchool() {
List<Object> schools = schoolRepository.getSchoolIdAndName();
return schools;
}
Object
এমআরপি অনুসারে বর্ণিত কাস্টম ইন্টারফেসের পরিবর্তে আপনার উচিত ।
আমার ক্ষেত্রে আমি ক্ষেত্রগুলি প্রয়োজন নেই সেগুলি ছাড়া একটি পৃথক সত্তা শ্রেণি তৈরি করেছি (কেবলমাত্র প্রয়োজনীয় ক্ষেত্রগুলির সাথে)।
একই সারণিতে সত্তাটি মানচিত্র করুন। এখন যখন সমস্ত কলামগুলির প্রয়োজন হয় আমি পুরানো সত্তাটি ব্যবহার করি, যখন কেবলমাত্র কিছু কলামের প্রয়োজন হয়, আমি লাইট সত্তাটি ব্যবহার করি।
যেমন
@Entity
@Table(name = "user")
Class User{
@Column(name = "id", unique=true, nullable=false)
int id;
@Column(name = "name", nullable=false)
String name;
@Column(name = "address", nullable=false)
Address address;
}
আপনি এর মতো কিছু তৈরি করতে পারেন:
@Entity
@Table(name = "user")
Class UserLite{
@Column(name = "id", unique=true, nullable=false)
int id;
@Column(name = "name", nullable=false)
String name;
}
আপনি যখন কলামগুলি আনার জন্য জানেন (এবং এটি পরিবর্তন হবে না) এটি কাজ করে।
আপনার কলামগুলি গতিশীলভাবে সিদ্ধান্ত নেওয়ার প্রয়োজন হলে কাজ করবে না।
আমি অনুমান করি যে সহজ উপায়টি কোয়েরিডিএসএল ব্যবহার করা হতে পারে যা স্প্রিং-ডেটা সহ আসে।
আপনার প্রশ্নের উত্তর ব্যবহার করা যেতে পারে
JPAQuery query = new JPAQuery(entityManager);
List<Tuple> result = query.from(projects).list(project.projectId, project.projectName);
for (Tuple row : result) {
System.out.println("project ID " + row.get(project.projectId));
System.out.println("project Name " + row.get(project.projectName));
}}
সত্তা পরিচালকটি অনুমোদিত হতে পারে এবং আপনি সর্বদা অবজেক্ট এবং ক্লাজের সাথে কাজ না করে * কিউএল ভাষা ব্যবহার করবেন।
আপনি লিঙ্কটিতে দেখতে পারেন শেষ পছন্দটি প্রায় আমার কাছে মনে হয়, আরও মার্জিত, এটি হ'ল ফলাফলের জন্য ডিটিও ব্যবহার করে। আপনার উদাহরণে প্রয়োগ করুন যা হবে:
JPAQuery query = new JPAQuery(entityManager);
QProject project = QProject.project;
List<ProjectDTO> dtos = query.from(project).list(new QProjectDTO(project.projectId, project.projectName));
প্রকল্পডিটিও হিসাবে সংজ্ঞা দেওয়া হচ্ছে:
class ProjectDTO {
private long id;
private String name;
@QueryProjection
public ProjectDTO(long projectId, String projectName){
this.id = projectId;
this.name = projectName;
}
public String getProjectId(){ ... }
public String getProjectName(){....}
}
নতুন বসন্ত সংস্করণগুলির সাহায্যে কেউ নিম্নলিখিত হিসাবে করতে পারে:
নেটিভ কোয়েরি ব্যবহার না করা হলে নীচের মতো এটি করা যেতে পারে:
public interface ProjectMini {
String getProjectId();
String getProjectName();
}
public interface ProjectRepository extends JpaRepository<Project, String> {
@Query("SELECT p FROM Project p")
List<ProjectMini> findAllProjectsMini();
}
নেটিভ ক্যোয়ারী ব্যবহার করে নীচের মত একই কাজ করা যেতে পারে:
public interface ProjectRepository extends JpaRepository<Project, String> {
@Query(value = "SELECT projectId, projectName FROM project", nativeQuery = true)
List<ProjectMini> findAllProjectsMini();
}
বিশদ জন্য ডক্স পরীক্ষা করুন
আমার মতে এটি দুর্দান্ত সমাধান:
interface PersonRepository extends Repository<Person, UUID> {
<T> Collection<T> findByLastname(String lastname, Class<T> type);
}
এবং এটি যেমন ব্যবহার
void someMethod(PersonRepository people) {
Collection<Person> aggregates =
people.findByLastname("Matthews", Person.class);
Collection<NamesOnly> aggregates =
people.findByLastname("Matthews", NamesOnly.class);
}
স্প্রিং ডেটা জেপিএ ব্যবহার করে ডাটাবেস থেকে নির্দিষ্ট কলামগুলি নির্বাচন করার ব্যবস্থা রয়েছে
---- ডিএওআইএমপিএল ----
@Override
@Transactional
public List<Employee> getAllEmployee() throws Exception {
LOGGER.info("Inside getAllEmployee");
List<Employee> empList = empRepo.getNameAndCityOnly();
return empList;
}
---- রেপো ----
public interface EmployeeRepository extends CrudRepository<Employee,Integer> {
@Query("select e.name, e.city from Employee e" )
List<Employee> getNameAndCityOnly();
}
এটি আমার ক্ষেত্রে 100% কাজ করেছে। ধন্যবাদ।
আপনি জেপিকিউএল ব্যবহার করতে পারেন:
TypedQuery <Object[]> query = em.createQuery(
"SELECT p.projectId, p.projectName FROM projects AS p", Object[].class);
List<Object[]> results = query.getResultList();
অথবা আপনি স্থানীয় এসকিএল কোয়েরি ব্যবহার করতে পারেন।
Query query = em.createNativeQuery("sql statement");
List<Object[]> results = query.getResultList();
আপনি আপনার সংগ্রহস্থল ইন্টারফেস ক্লাসে নীচের কোডটি প্রয়োগ করতে পারেন।
সত্তার নাম অর্থ প্রকল্পের মতো আপনার ডাটাবেস সারণির নাম। এবং তালিকার অর্থ হল প্রকল্পগুলি আপনার প্রকল্পগুলির সত্তা শ্রেণি।
@Query(value="select p from #{#entityName} p where p.id=:projectId and p.projectName=:projectName")
List<Project> findAll(@Param("projectId") int projectId, @Param("projectName") String projectName);
নেটিভ ক্যোয়ারী ব্যবহার:
Query query = entityManager.createNativeQuery("SELECT projectId, projectName FROM projects");
List result = query.getResultList();
আপনি @ জম্বি দ্বারা প্রস্তাবিত উত্তরটি ব্যবহার করতে পারেন এবং:
findAll()
এই উদ্দেশ্যটির জন্য পদ্ধতিটিকে ওভাররাইড করবেন না তবে নিজের পছন্দের নামটি ব্যবহার করুন;List
আপনার নতুন ইন্টারফেস (উদাঃ List<SmallProject>
) এর সাথে প্যারামিট্রাইজ করা ফিরে আসতে ভুলবেন না ।