我一直试图返回以给定名称开头但未成功的城市的基本列表,我尝试了以下所有组合:
List<City> findByNameENStartingWithIgnoreCaseAndAdminDivisionAndCountry( String cityName, AdministrativeDivision administrativeDivision, 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);
我正在使用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);
}
答案 0 :(得分:0)
这是我在自己的测试用例中的错误,我没有通过正确的省份,因此我只想确认实际上我发布的两种查询方法都可以正常工作。我个人更喜欢Option#1,因为它涉及的维护代码更少。