0

我正在使用 Micronaut Data 1.0.2 版。

给定以下 JPA 实体类:

@Entity
public class Product {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;
    private String code;
    private String name;
    private String fullName;
}

我可以使用以下方法创建全文搜索查询PageableRepository

@Repository
public interface ProductRepository extends PageableRepository<Product, Long> {
    Slice<Product> findByCodeLikeOrNameLikeOrFullNameLike(
        String code, String name, String fullName, Pageable pageable);
}

但是,我有一个问题要为该name属性添加另一个标准。我想要实现的相当于下面的SQL:

select * from product
where code like '%search%' 
or (name like '%search%' and name not like '%-%')
or full_name like '%search%'

我测试了以下方法:

Slice<Product> findByCodeLikeOrNameLikeAndNotLikeOrFullNameLike
Slice<Product> findByCodeLikeOrNameLikeAndNotContainsOrFullNameLike
Slice<Product> findByCodeLikeOrNameLikeAndNameNotLikeOrFullNameLike
Slice<Product> findByCodeLikeOrNameLikeAndNameNotContainsOrFullNameLike

知道如何使它起作用吗?

感谢先进。

4

1 回答 1

1

如果你使用 a@Query那么这应该是这样的:

@Query(value = "select p from Product p where (p.code like :code or p.fullName like :fullName or p.name like :name) and p.name not like :ignoreName") 
Slice<Product> fullSearch(String code, String name, String ignoreName, String fullName, Pageable pageable);

在这里你可以省略countQuery因为你使用Slice<Product>

如果要使用Page<Product>,则需要提供元素总数。因此,您需要提供计数查询。

喜欢:

countQuery = "select count(p.id) from Product p where (p.code like :code or p.fullName like :fullName or p.name like :name) and p.name not like :ignoreName")
于 2020-08-25T14:43:00.350 回答