【问题标题】:JPQL in clause with enumJPQL 在带有枚举的子句中
【发布时间】:2015-07-16 22:47:06
【问题描述】:

我有基于 spring boot 1.2.3 的应用程序。其中一个模型非常具体:包含枚举列表。当我尝试通过 spring jpa 查询调用时,sql 的一部分消失 [c.categories IN (:category) 替换为 (. in (?))]。我想这可能是图书馆的一些问题,或者我做错了什么。

你知道如何解决这个问题吗?

日志捕获 SQL:

select count(myobject0_.id) as col_0_0_ from myobject myobject0_ cross join myobject0_categories categories1_ where myobject0_.id=categories1_.myobject_id and (. in (?))

错误:

o.h.engine.jdbc.spi.SqlExceptionHelper   : SQL Error: 0, SQLState: 07001
java.sql.SQLException: No value specified for parameter 1

来自接口的原始 JPQL:

@Query("from Myobject c where and c.categories IN (:category)")
Page<Myobject> findAll(@Param("category") Set<Category> categories, Pageable pageable);

目标模型包含:

@Column(name = "category")
@Enumerated(EnumType.STRING)
@ElementCollection(fetch = FetchType.LAZY)
@CollectionTable(name = "myobject_categories", joinColumns = @JoinColumn(name = "myobject_id"))
    private Set<Category> categories;

枚举模型:

public enum Category {
CATEGORY(1), CATEGORY2(2);

private final Integer id;

Category(Integer id) { this.id=id; }

public Integer getId() { return id; }
}

【问题讨论】:

    标签: hibernate spring-boot jpa spring-data-jpa jpql


    【解决方案1】:

    这样的东西是有效的 JPQL,可用于任何兼容的 JPA 2 提供程序

    SELECT c FROM Myobject c WHERE :category MEMBER OF c.categories
    

    【讨论】:

    • 这是正确的,但是当我发送参数列表时它不起作用。
    • 所以向你的 JPA 提供者提出一个错误
    • 好的。可能这个解决方案是最好的。另外您的 JPQL 声明是正确的,所以我接受它。
    【解决方案2】:

    正确的解决方案是反转 IN 子句,然后 jpql 将创建子查询。相当丑陋,但它有效。

    @Query("from Myobject c where :category in elements(c.categories)")
    Page<Myobject> findAll(@Param("category") Set<Category> categories, Pageable pageable);
    

    记录的 SQL:

    select count(myobject0_.id) as col_0_0_ from myobject myobject0_ where (myobject0_.updated is not null) and (? in (select categories1_.category from comic_categories categories1_ where myobject0_.id=categories1_.comic_id))
    

    【讨论】:

    • JPQL中没有“元素”这样的关键字,JPQL以“SELECT {alias}”开头
    猜你喜欢
    • 2013-07-19
    • 2013-12-18
    • 2013-05-28
    • 2023-03-31
    • 2015-09-20
    • 2021-01-11
    • 2014-05-10
    • 2012-04-27
    • 1970-01-01
    相关资源
    最近更新 更多