मैं सभी डेटाबेस संचालन करने के लिए स्प्रिंग जेपीए का उपयोग कर रहा हूं। हालाँकि मुझे नहीं पता कि स्प्रिंग जेपीए में एक तालिका से विशिष्ट कॉलम कैसे चुनें?
उदाहरण के लिए:
SELECT projectId, projectName FROM projects
मैं सभी डेटाबेस संचालन करने के लिए स्प्रिंग जेपीए का उपयोग कर रहा हूं। हालाँकि मुझे नहीं पता कि स्प्रिंग जेपीए में एक तालिका से विशिष्ट कॉलम कैसे चुनें?
उदाहरण के लिए:
SELECT projectId, projectName FROM projects
जवाबों:
आप इस तरह एक वर्ग से एनोटेशन nativeQuery = true
में सेट कर सकते हैं :@Query
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();
मैं विशेष रूप से वाक्यविन्यास पसंद नहीं करता (यह थोड़ा सा हैक होता है ...) लेकिन यह सबसे सुरुचिपूर्ण समाधान है जिसे मैं खोजने में सक्षम था (यह जेपीए रिपॉजिटरी वर्ग में एक कस्टम JPQL क्वेरी का उपयोग करता है):
@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
जैसा कि निर्माता आर्ग करते हैं।
मेरी स्थिति में, मुझे केवल json परिणाम की आवश्यकता है, और यह मेरे लिए काम करता है:
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
mpr द्वारा बताए गए कस्टम इंटरफ़ेस के साथ स्थानापन्न होना चाहिए ।
मेरे मामले में मैंने उन क्षेत्रों के बिना एक अलग इकाई वर्ग बनाया है जिनकी आवश्यकता नहीं है (केवल उन क्षेत्रों के साथ जिनकी आवश्यकता है)।
इकाई को उसी तालिका में मैप करें। अब जब सभी स्तंभों की आवश्यकता होती है तो मैं पुरानी इकाई का उपयोग करता हूं, जब केवल कुछ स्तंभों की आवश्यकता होती है, तो मैं लाइट इकाई का उपयोग करता हूं।
जैसे
@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;
}
यह तब काम करता है जब आप कॉलम को जानते हैं (और यह बदलने वाला नहीं है)।
यदि आपको स्तंभों को गतिशील रूप से तय करने की आवश्यकता है तो काम नहीं करेगा।
मुझे लगता है कि QueryDSL का उपयोग करने का आसान तरीका वसंत-डेटा के साथ आता है।
आपके प्रश्न का उपयोग करके उत्तर हो सकता है
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));
}}
इकाई प्रबंधक को स्वतः प्राप्त किया जा सकता है और आप हमेशा उपयोग * QL भाषा के बिना ऑब्जेक्ट और क्लैस के साथ काम करेंगे।
जैसा कि आप लिंक में देख सकते हैं कि अंतिम विकल्प लगता है, लगभग मेरे लिए, अधिक सुरुचिपूर्ण, अर्थात्, परिणाम को संग्रहीत करने के लिए डीटीओ का उपयोग करना। आपके उदाहरण पर लागू होगा:
JPAQuery query = new JPAQuery(entityManager);
QProject project = QProject.project;
List<ProjectDTO> dtos = query.from(project).list(new QProjectDTO(project.projectId, project.projectName));
ProjectDTO को परिभाषित करना:
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);
}
स्प्रिंग डेटा जेपीए का उपयोग करते हुए डेटाबेस से विशिष्ट कॉलम का चयन करने का प्रावधान है
---- DAOImpl में ----
@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% काम किया। धन्यवाद।
आप JPQL का उपयोग कर सकते हैं:
TypedQuery <Object[]> query = em.createQuery(
"SELECT p.projectId, p.projectName FROM projects AS p", Object[].class);
List<Object[]> results = query.getResultList();
या आप देशी sql क्वेरी का उपयोग कर सकते हैं।
Query query = em.createNativeQuery("sql statement");
List<Object[]> results = query.getResultList();
आप नीचे दिए गए कोड को अपने रिपॉजिटरी इंटरफ़ेस क्लास में लागू कर सकते हैं।
Unitname का अर्थ है कि आपका डेटाबेस तालिका नाम जैसे प्रोजेक्ट्स। और सूची का मतलब है प्रोजेक्ट आपके प्रोजेक्ट्स में एंटिटी क्लास है।
@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>
) के साथ एक पैराड्राइक को वापस करना याद रखें ।