【问题标题】:How to change the @Namednativequery.query dynamic but non-programatically?如何以非编程方式动态更改@Namednativequery.query?
【发布时间】:2018-05-07 11:20:17
【问题描述】:

现在怎么样

@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 IS SUPPLIED 由客户端 rest 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 NOT SUPPLIED 由客户端 rest 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 ?

我猜这应该是最好的选择。任何帮助表示赞赏。

【问题讨论】:

    标签: postgresql spring-data-jpa hibernate-criteria


    【解决方案1】:

    规范 + QueryDSl/Criteria 似乎很重。

    我不同意。因为在对 Mateusz 回答的评论中,您建议您有多个此类参数,Specification 似乎是一个完美的选择。

    在类似的情况下,find-by-example 也可以,但它不支持 in-clauses。

    如果您愿意考虑 @Query 注释,您可以使用 SpEL 支持编写如下内容:

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

    代码中的错别字不是错误,而是一种训练功能。

    【讨论】:

      【解决方案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

      【讨论】:

      • 有多个这样的参数(比如 N 参数),如名称 acc。以你的例子。在建议的这种情况下,这种不同查询的数量将随着 power(2,N) 呈指数增长。
      猜你喜欢
      • 2014-02-22
      • 2011-08-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-05
      • 2016-11-06
      • 2023-03-22
      • 1970-01-01
      相关资源
      最近更新 更多