无法对 ElementCollection 中具有匹配枚举的实体进行 @Query
Unable to @Query for entities with a matching enum in an ElementCollection
我有一个实体,它有一个枚举列表,作为字符串存储在一个集合table中。
enum Color {
RED,
GREEN,
BLUE
}
@Entity
class Product {
@Id
private Long id;
@Column
private String name;
@ElementCollection
@Enumerated(EnumType.STRING)
@CollectionTable(name = "ProductColors", joinColumns = @JoinColumn(name = "product_id"))
@Column(name="color")
private List<Color> availableColors;
}
这适用于通过 spring-rest-webmvc 创建和获取产品。但我希望能够找到给定颜色的所有产品。
我尝试了以下方法:
@RepositoryRestResource
public interface ProductRepository extends CrudRepository<Long, Product> {
@Query("select p from Product p where :color in p.availableColors")
List<Product> findByColor(@Param("color") Color color);
}
但是会报错:
... CROSS JOIN PRODUCTCOLORS COLORS1_ WHERE PRODUCT0_.ID = COLORS1_.PRODUCT_ID AND (? in (.[*])) ...
... expected "NOT, EXISTS, INTERSECTS, SELECT, FROM" ...
是否可以像这样查询一个简单的 ElementCollection,或者我是否必须移动到一个成熟的实体来存储颜色关系?
的答案表明可以这样做,但我看不出我做错了什么。
在 JPA 规范中引用 JPQL BNF。
in_expression ::=
{state_valued_path_expression | type_discriminator} [NOT] IN
{ ( in_item {, in_item}* ) | (subquery) | collection_valued_input_parameter }
in_item ::= literal | single_valued_input_parameter
在你的情况下“p.availableColors”是不是一个"collection_valued_input_parameter"(或子查询,或其他选项)。它是您实体的一个字段。因此,这不是您正在尝试的 JPQL portable 语法。
但是,使用
select p from Product p where :color MEMBER OF p.availableColors
应该提供您所需要的,并且 JPA 实现可能会对枚举连接执行内部连接 table,在所需的特定枚举成员上添加 WHERE 子句。
我有一个实体,它有一个枚举列表,作为字符串存储在一个集合table中。
enum Color {
RED,
GREEN,
BLUE
}
@Entity
class Product {
@Id
private Long id;
@Column
private String name;
@ElementCollection
@Enumerated(EnumType.STRING)
@CollectionTable(name = "ProductColors", joinColumns = @JoinColumn(name = "product_id"))
@Column(name="color")
private List<Color> availableColors;
}
这适用于通过 spring-rest-webmvc 创建和获取产品。但我希望能够找到给定颜色的所有产品。
我尝试了以下方法:
@RepositoryRestResource
public interface ProductRepository extends CrudRepository<Long, Product> {
@Query("select p from Product p where :color in p.availableColors")
List<Product> findByColor(@Param("color") Color color);
}
但是会报错:
... CROSS JOIN PRODUCTCOLORS COLORS1_ WHERE PRODUCT0_.ID = COLORS1_.PRODUCT_ID AND (? in (.[*])) ...
... expected "NOT, EXISTS, INTERSECTS, SELECT, FROM" ...
是否可以像这样查询一个简单的 ElementCollection,或者我是否必须移动到一个成熟的实体来存储颜色关系?
在 JPA 规范中引用 JPQL BNF。
in_expression ::=
{state_valued_path_expression | type_discriminator} [NOT] IN
{ ( in_item {, in_item}* ) | (subquery) | collection_valued_input_parameter }
in_item ::= literal | single_valued_input_parameter
在你的情况下“p.availableColors”是不是一个"collection_valued_input_parameter"(或子查询,或其他选项)。它是您实体的一个字段。因此,这不是您正在尝试的 JPQL portable 语法。
但是,使用
select p from Product p where :color MEMBER OF p.availableColors
应该提供您所需要的,并且 JPA 实现可能会对枚举连接执行内部连接 table,在所需的特定枚举成员上添加 WHERE 子句。