java 使用条件查询JPA Spring进行搜索

mzaanser  于 2023-01-04  发布在  Java
关注(0)|答案(2)|浏览(147)

AssetItemDto具有字段名称和代码,我希望查找DB中符合以下任一条件的所有记录

  1. FindAll,其中名称=“A”和代码=“B”(如果名称和代码都存在且不为空)
  2. FindAll,其中name =“A”(如果name存在,并且code为空),反之亦然。
    如何使用条件查询实现相同的功能,请填写以下函数。
AssetItemDto
            
private String name;
private String code;

// Function I am using: 

Page<AssetItemDto> assetItemPage = assetItemService.findByCondition(assetItemDto,pageable);
                   
public Page<AssetItemDto> findByCondition(AssetItemDto assetItemDto , Pageable pageable) {
            
Page<AssetItem> entityPage = repository.findAll(assetItemDto,pageable);
                    List<AssetItem> entities = entityPage.getContent();
            
return new PageImpl<>(mapList(entities, AssetItemDto.class), pageable, entityPage.getTotalElements());
}
pgky5nke

pgky5nke1#

您可以使用存储库方法顶部的@Query注解向数据库表写入自定义查询。下面是根据您的条件编写的示例。您可以相应地修改方法名称和表名称。

@Query("""
        SELECT * 
        FROM AssetItemDto
        where (name = 'A' AND code = 'B') OR (name = 'A' AND code IS NULL) OR (name IS NULL AND code = 'B');
""")
    List<AssetItemDto> findAllByCustomCondition();
ogq8wdun

ogq8wdun2#

你在找这样的东西吗?

Page<AssetItemEntity> findByCondition(String name, String code, Pageable pageable) {

    Specification<AssetItemEntity> spec = (root, query, builder) ->
        builder.or(
            builder.equal(root.get("name"), root.get("code")),
            builder.or(
                builder.and(
                    builder.isNull(root.get("name")),
                    builder.equal(root.get("code"), code)
                ),
                builder.and(
                    builder.isNull(root.get("code")),
                    builder.equal(root.get("name"), name)
                )
            )
        );

    return assetItemRepository.findAll(spec, pageable);
}

相关问题