Как изменить @ Namednativequery.query динамически, но не программно?

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

@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 / Criteria кажется тяжелой для этой цели.
  • Кроме того, StringBuilder для создания запроса String также кажется обходным решением JDBC, но не правильным элегантным решением

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

ИЛИ ЖЕ

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

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

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
0
770
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Если вам действительно нужно использовать @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.

Есть несколько таких Params (скажем, N params), таких как имена в соотв. к твоему примеру. В таком случае, как предполагалось, количество таких разных запросов будет расти экспоненциально, как мощность (2, N).

Arnab Dutta 07.05.2018 18:51
Ответ принят как подходящий

Specification + QueryDSl/Criteria seems heavy for the purpose.

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

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

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

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

Опечатки в коде - это не ошибка, а средство обучения.

Другие вопросы по теме