java - 无法 @Query 查找 ElementCollection 中具有匹配枚举的实体

标签 java jpa spring-data-jpa spring-data-rest

我有一个实体,其中包含枚举列表,以字符串形式存储在集合表中。

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,或者我是否必须移动到成熟的实体来存储颜色关系?

答案在https://stackoverflow.com/a/34132646/153225建议可以这样做,但我看不出我做错了什么。

最佳答案

引用 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 可移植语法。

但是,使用

select p from Product p where :color MEMBER OF p.availableColors

应该提供您需要的内容,并且 JPA 实现可能会对枚举连接表执行 INNER JOIN,从而在所需的特定枚举成员上添加 WHERE 子句。

关于java - 无法 @Query 查找 ElementCollection 中具有匹配枚举的实体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34303381/

相关文章:

java - 停止 Java 时不执行存储过程

java - 在 JPA 中选择没有关联销售契约(Contract)的采购订单

java - spring-data-jpa 三向交集表

java - 检查 JtextField 是否不等于保存的数组

javascript - Java servlet 对 JavaScript 的响应

java - 当更新一个实体时, hibernate 尝试删除其他实体中的引用

java - 如何使用 JPA 关系实体创建 RestAPI

spring-data-jpa - 我们可以在 JPA 查询中一起使用 HINT_FETCH_SIZE 和 Pageable 吗

java - int[] 数组和 int 数组[] 的区别

java - 英雄萨克斯错误