【问题标题】:JPA repository findBySOMETHING, could not extract resultJPA 存储库 findBySOMETHING,无法提取结果
【发布时间】:2020-08-05 06:41:31
【问题描述】:

我正在为一些玩具项目使用 JPA 存储库,我想获取对象列表,但结果是 could not extract ResultSet; SQL[n/a]

这是我的目标(没什么重要的,只关注 lob plz)

{
    ...
    private Long id

    @Lob
    @Column(columnDefinition = "text")
    private String content;
    ...
}

然后,我使用repository 到findByContentLike("CONTENT"),结果失败,原因是无法提取结果。

为什么会这样?甚至我设置application.properties 就像spring.jpa.properties.hibernate.jdbc.lob.non_contextual_creation=true 一样

有人知道这个错误吗?请把我带到光明中。

【问题讨论】:

标签: java hibernate spring-data-jpa lob


【解决方案1】:

如果您需要使用 %(wildcard) 包裹的自动参数绑定,请使用

findByContentContaining("Content")

或者你需要在字符串中手动添加%(wildcard)

findByContentLike("%Content%")

【讨论】:

    【解决方案2】:

    JPA 方法查询需要特殊的语法。最常见的是它们被构建为:findBy + 您实体的一个字段。在您的情况下,like 是多余的。

    有关示例,请参阅此 reference to the docs

    随着复杂性的增加,您可能希望使用 JPQL 编写自己的查询。一个小例子:

    @Query("SELECT p FROM Product p "
                + "LEFT JOIN p.categories category "
                + "WHERE UPPER(p.name) LIKE UPPER(CONCAT('%', COALESCE(:searchRequest, ''), '%')) "
                + "AND UPPER(p.description) LIKE UPPER(CONCAT('%', COALESCE(:description, ''), '%')) "
                + "AND p.price BETWEEN :priceLow AND :priceHigh "
                + "AND p.averageRating >= :averageRating "
                + "AND p.archived = :archived "
                + "AND ((category.name IN :selectedCategories) "
                + "OR (:amountOfSelectedCategories = 0 AND category IN (SELECT c FROM Category c))) "
                + "GROUP BY p "
                + "HAVING SIZE(p.categories) >= :amountOfSelectedCategories"
        )
        Page<Product> findAllBySearchModel(
                Pageable pageable,
                @Param("searchRequest") String searchRequest,
                @Param("description") String description,
                @Param("priceLow") BigDecimal priceLow,
                @Param("priceHigh") BigDecimal priceHigh,
                @Param("averageRating") double averageRating,
                @Param("archived") boolean archived,
                @Param("selectedCategories") List<String> selectedCategories,
                @Param("amountOfSelectedCategories") int amountOfSelectedCategories
        );
    

    不要忘记用@Entity 标记您的实体类,并让您的存储库扩展JpaRepository&lt;MyEntityClass, Long&gt;,其中Long 对应于您实体的@Id 字段。

    【讨论】:

      猜你喜欢
      • 2017-12-13
      • 1970-01-01
      • 2022-01-23
      • 2018-09-21
      • 1970-01-01
      • 2021-12-01
      • 2019-05-29
      • 2013-06-13
      相关资源
      最近更新 更多