2016-04-06 38 views
2

I2 varlık sınıfları aşağıdaki 1.student 2. resluts sahip ve ayarlanmış bir sonucun elde edildiği aşağıdaki uyarlanmış bir sorguyubirden fazla işletme Yay JPA sorgu resultset birleştirme erişme

select s.roll_no , s.first_name, s.age ,r.subject_name , r.marks from student s , results r where s.roll_no= : rollNo and r.marks >70 

yürüterek bir resultset dönmek zorunda Hem öğrenci hem de sonuç varlığının kombinasyonu. Bu senaryoda, uygulamamı nasıl yazarım. i resultset ve sonuçları varlık nesnelerden sadece öğrenci varlık değerleri burada görünür değildi elde edebildi yukarıdaki ile

public interface GetStudentDetail extends CrudRepository<Student, String> { 
    @Transactional(readOnly=true) 
    @Query("select s.roll_no , s.first_name, s.age ,r.subject_name , r.marks from student s , results r where s.roll_no= : rollNo and r.marks >70") 
    public List<student> getStudentDetails(@Param("rollNo")String rollNo); 
} 

: Ben iki yaklaşımın

Yaklaşım 1'in altında çalıştık.

Yaklaşım 2: Bununla

public interface GetStudentDetail extends CrudRepository<Student, String> { 
    @Transactional(readOnly=true) 
    @Query("select s.roll_no , s.first_name, s.age ,r.subject_name , r.marks from student s , results r where s.roll_no= : rollNo and r.marks >70") 
    public List<Object[]> getStudentDetails(@Param("rollNo")String rollNo); 
} 

i varlık değişkeni hem bir daha VO sınıfını yarattı ve ben aşağıya elle

List<StudentResultVo>studtVoObjList = new ArrayList<StudentResultVo>(); 
    for (Object[] resObj : resultSetList) { 
     StudentResultVo studtVO = new StudentResultVo(); 
     if (resObj[0] != null) { 
      studtVO.setRollNo(resObj[0].toString().trim()); 
     } 
     //.First name 
     //.Age 

     if (resObj[3] != null) { 
      studtVO.setSubName(resObj[3].toString().trim()); 
     } 
     //.Marks 
     studtVoObjList.add(studtVO); 
    } 

gibi kendisine pozisyon erişerek bu nesneye ayarlanmış i Yukarıdaki yaklaşımın iyi bir kodlama uygulaması olmadığını biliyordu. Bu soruna çözüm bulmak için herhangi bir yolu var mı.

Teşekkürler.

cevap

2

ilk yeni arayüzü oluşturmak ve beyan yönteminiz

public interface GetStudentDetailCustom { 
    public List<Object[]> getStudentDetails(String rollNo); 
} 

ve ikinci sınıf GetStudentDetailImpl oluşturmak ve uygulamak arayüzünü

public class GetStudentDetailImpl implements GetStudentDetailCustom { 

    @PersistenceContext 
    private EntityManager entitymanager; // I use entity manager also you want to use inject SessionFactory etc.. 

    @Override 
    public List<Object[]> getStudentDetails(String rollNo) { 
     String queryString = "SELECT s.roll_no , s.first_name, s.age ,r.subject_name , r.marks FROM student s " 
       + ", results r WHERE s.roll_no= :rollNo and r.marks > 70"; 

     Query query = entitymanager.createQuery(queryString); 
     query.setParameter("rollNo", rollNo); 

     return query.getResultList(); 
    } 

} 

ve nihayet bu

public interface GetStudentDetail extends CrudRepository<Student, String>, GetStudentDetailCustom {} 

ve benzeri deponuzu planı ayrı servise GetStudentDetail'u enjekte et E sınıfı ve çağrı getStudentDetails yöntem servis katmanında

Örnek kullanım:

@Autowired 
private GetStudentDetail getStudentDetail; 

getStudentDetail.getStudentDetails(String rollNo); 

referans cevap: How to add custom method to Spring Data JPA

ve bahar referansı: http://docs.spring.io/spring-data/jpa/docs/current/reference/html/#repositories.single-repository-behaviour