سؤال

أنا باستخدام الربيع جبا لأداء جميع عمليات قاعدة البيانات.ومع ذلك أنا لا أعرف كيفية تحديد أعمدة معينة من جدول في الربيع جبا?

على سبيل المثال:
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>).
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top