الربيع جبا اختيار أعمدة محددة
-
21-12-2019 - |
سؤال
أنا باستخدام الربيع جبا لأداء جميع عمليات قاعدة البيانات.ومع ذلك أنا لا أعرف كيفية تحديد أعمدة معينة من جدول في الربيع جبا?
على سبيل المثال:
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()
ربما يستحق النظر في بيانات الربيع المستندات كذلك.
نصائح أخرى
يمكنك استخدام التوقعات من بيانات الربيع جبا (وثيقة).في حالتك ، قم بإنشاء واجهة:
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;
}
في حالتي ، قمت بإنشاء فئة كيان منفصلة بدون الحقول غير المطلوبة (فقط مع الحقول المطلوبة).
تعيين الكيان إلى نفس الجدول.الآن عندما تكون جميع الأعمدة مطلوبة ، أستخدم الكيان القديم ، عندما تكون هناك حاجة إلى بعض الأعمدة فقط ، أستخدم الكيان البسيط.
على سبيل المثال.
@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(){....}
}
في رأيي هذا هو حل كبير:
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);
}
مع أحدث إصدارات الربيع يمكن للمرء أن يفعل ما يلي:
إذا لم تستخدم الاستعلام الأصلي هذا يمكن القيام به على النحو التالي:
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();
}
لمزيد من التفاصيل تحقق من المستندات
Using Spring Data JPA there is a provision to select specific columns from database
---- In DAOImpl ----
@Override
@Transactional
public List<Employee> getAllEmployee() throws Exception {
LOGGER.info("Inside getAllEmployee");
List<Employee> empList = empRepo.getNameAndCityOnly();
return empList;
}
---- In Repo ----
public interface EmployeeRepository extends CrudRepository<Employee,Integer> {
@Query("select e.name, e.city from Employee e" )
List<Employee> getNameAndCityOnly();
}
It worked 100% in my case.
Thanks.
من الممكن تحديد null
كقيمة حقل في سكل الأصلي.
@Query(value = "select p.id, p.uid, p.title, null as documentation, p.ptype " +
" from projects p " +
"where p.uid = (:uid)" +
" and p.ptype = 'P'", nativeQuery = true)
Project findInfoByUid(@Param("uid") String uid);
يمكنك تطبيق التعليمات البرمجية أدناه في فئة واجهة المستودع الخاص بك.
إنتيتينام يعني اسم جدول قاعدة البيانات الخاصة بك مثل المشاريع.والقائمة تعني أن المشروع هو فئة الكيان في مشاريعك.
@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);
يمكنك استخدام جبكل:
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 query = entityManager.createNativeQuery("SELECT projectId, projectName FROM projects");
List result = query.getResultList();
يمكنك استخدام الإجابة التي اقترحها @جومبي ، و:
- ضع الواجهة في ملف منفصل ، خارج فئة الكيان;
- استخدم الاستعلام الأصلي أم لا (يعتمد الاختيار على احتياجاتك);
- لا تتجاوز
findAll()
طريقة لهذا الغرض ولكن استخدام اسم من اختيارك; - تذكر أن تعيد أ
List
بارامتريزد مع واجهة جديدة (على سبيل المثال.List<SmallProject>
).