Как изменить динамику @ Namednativequery.query, но не для программ? - PullRequest
0 голосов
/ 07 мая 2018

В настоящее время, как это

@Service
 class Impl{

    public ResponseEntity<?> find(patientIdList,shapeNameList){
      someEntity =  repository.findByFilters(patientIdList,shapeNameList);

      return someEntity;
    }


 }

@Entity    
@NamedNativeQuery(      
        name = "MyEntity.findByFilters",
        query = "_________________________________",
        resultSetMapping = "dummyMapping"       
        ))   
@SqlResultSetMapping(
    name = "dummyMapping",
    ...
)
public class ...{
}

ИСПОЛЬЗУЕМЫЕ СЛУЧАИ:

когда shapeNameList ПОСТАВЛЯЕТСЯ клиентом, оставляя ввод json, тогда @ Namednativequery.query, упомянутый выше, должен быть: -------------------------------------------------- -------------------------------------------------- -------------------

query = SELECT DISTINCT a.shape_name as shapename, a.patient_id patientId, a.shape_type_id as shapetypeid  
                        FROM pairdb.tbl_sf_density a 
                        WHERE a.patient_id IN( ?1 )
                        AND a.shapeNameList IN( ?2 )  --this line needs to be dynamically incorporated 
                        group by shapename;

когда shapeNameList НЕ ПОСТАВЛЯЕТСЯ клиентом, оставляя ввод json, тогда @ Namednativequery.query, упомянутый выше, должен быть:
-------------------------------------------------- -------------------------------------------------- -------------------

query = SELECT DISTINCT a.shape_name as shapename, a.patient_id patientId, a.shape_type_id as shapetypeid 
                        FROM pairdb.tbl_sf_density a 
                        WHERE a.patient_id IN( ?1 )
                        -- AND a.shapeNameList IN( ?2 )  --this line needs to be dynamically omitted from the query within  @NamedNativeQuery above
                        group by shapename;
  • Спецификация + QueryDSl / Критерии кажется тяжелым для этой цели.
  • Также StringBuilder для создания запроса String также кажется обходным решением JDBC, но не является правильным элегантным решением

Мне не удается создать идеальное решение для этого динамического изменения части SQL. Может кто-нибудь помочь, пожалуйста, с простым решением Spring JPA?

OR

Можем ли мы просто манипулировать в Postgres SQL некоторой логикой для переключения между 'AND a.shapeNameList IN( ?2 ) ' против ' ' используя COALSCE / NULLIF / IFNULL / CASE WHEN THEN END ? anything ?

Наверное, это лучший вариант. Любая помощь приветствуется.

Ответы [ 2 ]

0 голосов
/ 14 мая 2018

Спецификация + QueryDSl / Критерии кажется тяжелым для этой цели.

Я не согласен. Так как в комментарии к ответу Матеуша вы предлагаете иметь несколько таких параметров, Specification кажется идеальным.

В аналогичных случаях поиск по примеру также работает, но не поддерживает входные предложения.

Если вы готовы рассмотреть аннотации @Query, вы можете использовать поддержку SpEL, напишите что-то вроде этого:

@Query("... where 0 = ?#{param.size} or a.shapeNameList IN :param")
public Something something(List param);

Опечатки в коде - это не ошибка, а обучающая функция.

0 голосов
/ 07 мая 2018

Если вам действительно нужно использовать @NamedNativeQuery, вы также можете создать различные запросы, аннотированные @NamedNativeQuery, и в сервисе решить, какой из них вызывать в зависимости от данных.Служба является подходящим местом для любой бизнес-логики, например, для решения, какой запрос вызывать.

Я бы также не помещал запросы в сущности, но вместо этого использовал бы репозитории.

Итак, набросокрешение может быть:

@Repository
interface ShapesRepository {

    @Query(...)
    List<Shape> findForPatiets(List patientIdList)

    @Query(...)
    List<Shape> findForPatientsAndNameList(List patientIdList, List names)
}

@Service
class ShapesService{
    public find(patientIdList,shapeNameList){
         if (isEmpty(shapeNameList)){
             repository.findForPatients(patientIdList);
         } else {
             repository.findForPatientsAndNameList(patientIdList, shapeNameList);
         }
    }

}

Но на вашем месте я бы серьезно подумал об использовании QueryDSL

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...