无法在JPA + spring数据中设置简单的LIKE + ignore案例查询

时间:2018-07-09 21:08:37

标签: spring-data-jpa

我一直试图返回以给定名称开头但未成功的城市的基本列表,我尝试了以下所有组合:

  1. 在Spring Data中使用纯JPA关键字:

List<City> findByNameENStartingWithIgnoreCaseAndAdminDivisionAndCountry( String cityName, AdministrativeDivision administrativeDivision, Country country);

  1. 使用LIKE和CONCAT:

@Query("SELECT c from City c WHERE UPPER(c.nameEN) LIKE CONCAT(UPPER(:cityName), '%') AND c.adminDivision = :adminDivision AND c.country = :country") List<City> findByNameENStartingWithIgnoreCaseAndAdminDivisionAndCountry(@Param("cityName") String cityName, @Param("adminDivision") AdministrativeDivision administrativeDivision, @Param("country") Country country);

我正在使用Spring Boot 2.03,Spring data 2.08及以下我的城市实体定义:

@Entity
@Data
@Table(name="city",
        uniqueConstraints=@UniqueConstraint(name = "uniqueCityConstraint", columnNames={"name_en", "country_iso3166_numeric3", "admin_division_id"}))
public class City  extends AbstractBaseEntityId {

    @Column(name="name_en")
    private String nameEN;

    @ManyToOne
    @JoinColumn(name="admin_division_id")
    private AdministrativeDivision adminDivision;

    @ManyToOne
    @JoinColumn(name="country_iso3166_numeric3", nullable=false)
    private Country country;

}

和我的application.properties:

spring.datasource.url = jdbc:hsqldb:mem:spring
spring.datasource.username = sa

# Keep the connection alive if idle for a long time (needed in production)
spring.datasource.testWhileIdle = true
spring.datasource.validationQuery = SELECT 1

# Show or not log for each sql query
spring.jpa.show-sql = true

# Hibernate ddl auto (create, create-drop, update, none)
spring.jpa.hibernate.ddl-auto = create

# Naming strategy
spring.jpa.hibernate.naming-strategy = org.hibernate.cfg.ImprovedNamingStrategy

# The SQL dialect makes Hibernate generate better SQL for the chosen database
spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.HSQLDialect

和我的CityRepository:

package com.billpayments.repository;

import com.billpayments.domain.AdministrativeDivision;
import com.billpayments.domain.City;
import com.billpayments.domain.Country;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.CrudRepository;
import org.springframework.data.repository.query.Param;

import java.util.List;

public interface CityRepository extends CrudRepository<City, Long> {
    @Cacheable(value="cityByNameAdminDivisionIdAndCountryCode", key="#p0 + #p1.id + #p2.iso3166Alpha2")
    City findByNameENIgnoreCaseAndAdminDivisionAndCountry(String name, AdministrativeDivision administrativeDivision, Country country);

    List<City> findByNameENIgnoreCaseAndCountry(String name, Country country);

    @Query("SELECT c from City c WHERE UPPER(c.nameEN) LIKE CONCAT(UPPER(:cityName), '%') AND c.adminDivision = :adminDivision AND c.country = :country")
    List<City> findByNameENStartingWithIgnoreCaseAndAdminDivisionAndCountry(@Param("cityName") String cityName, @Param("adminDivision") AdministrativeDivision administrativeDivision, @Param("country") Country country);


}

1 个答案:

答案 0 :(得分:0)

这是我在自己的测试用例中的错误,我没有通过正确的省份,因此我只想确认实际上我发布的两种查询方法都可以正常工作。我个人更喜欢Option#1,因为它涉及的维护代码更少。