Spring Boot Jpa 规范 Set Enums IN Set Enums
Spring Boot Jpa specification Set Enums IN Set Enums
您好,我想使用规范按类型过滤餐厅,但出现错误:
参数值 [SUSHI] 与预期类型不匹配 [java.util.Set (n/a)]
如何将枚举列表与枚举列表进行比较? :/
我的规范文件:
if(Objects.nonNull(category)){
predicates.add(root.get(Restaurant_.category).in(category));
}
餐厅型号:
@ElementCollection(targetClass = RestaurantCategory.class)
@Enumerated(EnumType.STRING)
@CollectionTable(name = "restaurant_category")
private Set<RestaurantCategory> category;
餐厅类别:
public enum RestaurantCategory {
STREET_FOOD, SUSHI, PIZZA, BURGER
}
我必须加入。
predicates.add(root.join(Restaurant_.category).in(类别));
同样有效 ;)
有同样的问题,这个问题对我有帮助。
就我而言,我想按国家/地区搜索我的佣金。
这是我如何解决我的问题。
域:
@Entity
@Table(name = "commission")
data class Commission(
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
var id: Long? = 0,
@ElementCollection(fetch = FetchType.EAGER)
@Enumerated(EnumType.STRING)
var countries: MutableSet<CountryCode>? = null,
@get: NotNull
@Enumerated(EnumType.STRING)
@Column(name = "type", nullable = false)
var type: CommissionType? = null
)
规格代码(@see findByCountries部分):
object CommissionSpecifications {
fun buildQuery(request: SearchCommissionRequest): Specification<Commission> {
var query = Specification.where<Commission>(distinct())
request.type?.also { query = query?.and(findByType(it)) }
request.countries?.also { if (it.isNotEmpty()) query = query?.and(findByCountries(it)) }
return query!!
}
private fun findByType(type: CommissionType): Specification<Commission> =
Specification { root, _, cb -> cb.equal(root.get<Commission>(Commission::type.name), type) }
private fun findByCountries(countries: Set<CountryCode>): Specification<Commission> =
Specification { root, _, _ ->
root.join<Commission, Set<CountryCode>>(Commission::countries.name).`in`(countries)
}
private fun distinct(): Specification<Commission?> {
return Specification { root: Root<Commission?>?, query: CriteriaQuery<*>, cb: CriteriaBuilder? ->
query.distinct(true)
null
}
}
}
您好,我想使用规范按类型过滤餐厅,但出现错误:
参数值 [SUSHI] 与预期类型不匹配 [java.util.Set (n/a)]
如何将枚举列表与枚举列表进行比较? :/
我的规范文件:
if(Objects.nonNull(category)){
predicates.add(root.get(Restaurant_.category).in(category));
}
餐厅型号:
@ElementCollection(targetClass = RestaurantCategory.class)
@Enumerated(EnumType.STRING)
@CollectionTable(name = "restaurant_category")
private Set<RestaurantCategory> category;
餐厅类别:
public enum RestaurantCategory {
STREET_FOOD, SUSHI, PIZZA, BURGER
}
我必须加入。 predicates.add(root.join(Restaurant_.category).in(类别));
同样有效 ;)
有同样的问题,这个问题对我有帮助。
就我而言,我想按国家/地区搜索我的佣金。 这是我如何解决我的问题。
域:
@Entity
@Table(name = "commission")
data class Commission(
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
var id: Long? = 0,
@ElementCollection(fetch = FetchType.EAGER)
@Enumerated(EnumType.STRING)
var countries: MutableSet<CountryCode>? = null,
@get: NotNull
@Enumerated(EnumType.STRING)
@Column(name = "type", nullable = false)
var type: CommissionType? = null
)
规格代码(@see findByCountries部分):
object CommissionSpecifications {
fun buildQuery(request: SearchCommissionRequest): Specification<Commission> {
var query = Specification.where<Commission>(distinct())
request.type?.also { query = query?.and(findByType(it)) }
request.countries?.also { if (it.isNotEmpty()) query = query?.and(findByCountries(it)) }
return query!!
}
private fun findByType(type: CommissionType): Specification<Commission> =
Specification { root, _, cb -> cb.equal(root.get<Commission>(Commission::type.name), type) }
private fun findByCountries(countries: Set<CountryCode>): Specification<Commission> =
Specification { root, _, _ ->
root.join<Commission, Set<CountryCode>>(Commission::countries.name).`in`(countries)
}
private fun distinct(): Specification<Commission?> {
return Specification { root: Root<Commission?>?, query: CriteriaQuery<*>, cb: CriteriaBuilder? ->
query.distinct(true)
null
}
}
}