首页 > 解决方案 > 如何在maven项目中使用动态查询?

问题描述

是否可以像下面的代码一样执行动态 jpa 或本机查询

我将“WHERE”条件作为字符串传递给存储库类,这是正确的方法吗?

List<Doctor1> doctorsList = null;
String str1 = null;
if (date != null) {
str1 = " d.hospitalId = " +hospitalId + " AND dt.date = '" + date + "' AND d.active = 1";
            
   if ((date != null) && (gender != null)) {
    str1 = str1 + " AND d.gender = '" + gender + "'";
   }
   if ((date != null) && (specializationId != null)) {
    str1 = str1 + " AND dsa.doctorId = d.doctorId AND dsa.active = 1";
                    

    }
else if (gender != null) {

str1 = " d.hospitalId = " +hospitalId + " AND d.gender = '" + gender + "' AND d.active = 1";
            
        if ((gender != null) && (specializationId != null)) {
        str1 = str1 + " AND dsa.doctorId = d.doctorId AND dsa.active = 1";

       }.........

}

doctorsList = doctorsRepository.selectDoctorDetails(str1);

DoctorRepository 类

@Query("select distinct d from Follow_My_Doct.tbl_doctors d LEFT JOIN DoctorDutyTime ddt ON ddt.doctorId = d.doctorId AND ddt.active = 1 LEFT JOIN DoctorSpecilaizationAssociation dsa ON dsa.active = 1 AND dsa.doctorId = d.doctorId :str1")
    List<Doctor1> selectDoctorDetails(String str1);

或者

@Query(value ="select distinct * from Follow_My_Doct.tbl_doctors d LEFT JOIN Follow_My_Doct.tbl_doctors_duty_time ddt ON ddt.doctorId = d.doctorId AND ddt.active = 1 LEFT JOIN Follow_My_Doct.tbl_doctor_specialization_association dsa ON dsa.active = 1 AND dsa.doctorId = d.doctorId ?1, nativeQuery = true)
    List<Doctor1> selectDoctorDetails(String str1);

标签: javasqlsql-serverhibernatejpa

解决方案


我不知道。这种方法可能会解决您的问题。我们在使用Sturts framework. 你可以试试 -

import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;

...
...
@PersistenceContext
private EntityManager entityManager;

public void test() {
    String queryStr = "select * from doctor where ";
    Query query = entityManager.createNativeQuery(queryStr);
    List<Doctor1> doctorsList = null;
    String str1 = null;
    if (date != null) {
       str1 = " d.hospitalId = ?1 AND dt.date = ?2 AND d.active = ?3";
       query.setParameter(1, hospitalId);
       query.setParameter(2, date);
       query.setParameter(3, 1);
       //for number tracking inside if-else, use extra variable.              
       if ((date != null) && (gender != null)) {
          //update using similar way
          str1 = str1 + " AND d.gender = '" + gender + "'";
       }
       if ((date != null) && (specializationId != null)) {
           //
           str1 = str1 + " AND dsa.doctorId = d.doctorId AND dsa.active = 1";                
       }
           
    }else if (gender != null) {
       str1 = " d.hospitalId = " +hospitalId + " AND d.gender = '" + gender + "' AND d.active = 1";
                    
      if ((gender != null) && (specializationId != null)) {
         str1 = str1 + " AND dsa.doctorId = d.doctorId AND dsa.active = 1";
      }

    }

    doctorsList = doctorsRepository.selectDoctorDetails(entityManager,query, str1);
}

doctorRepository

public Doctor1 selectDoctorDetails(EntityManager entityManager, Query query, String str) {
        
   try {
      return new Doctor1((Object[]) query.getSingleResult());
   } catch (Exception e) {
      e.printStackTrace();
      
   }
}

推荐阅读