Spring Data JPA:通过 JSON 属性查找

4

我正在使用Spring Data JPA,我的模型中的一个属性是PostgreSQL中的jsonb列。这是它的映射方式:

@Type(type = "catalog.utils.model.JsonbType")
@Column(name = "marc", columnDefinition = "jsonb")
private Marc marc;

这个对象可以被成功地保存、检索和更新。然后在我的仓库中,我编写了一个根据特定的 json 属性来检索的方法。这个查询在 PostgreSQL 中可以正常工作:

public interface AuthorityRepository  extends JpaRepository<Authority, Integer>, JpaSpecificationExecutor<Authority> {

    @Query(
            value = "SELECT * FROM my_table where marc -> 'controlNumber' = :controlNumber",
            nativeQuery = true
    )
    List<Authority> findAuthoritiesByControlNumber(@Param("controlNumber") String controlNumber);
}

当我尝试使用我的repository的这个方法时,我遇到了这个错误:org.hibernate.exception.SQLGrammarException: could not extract ResultSet 在控制台中,我看到了刚才描述的查询执行和这个错误消息,我觉得它很困惑,因为当直接在PostgreSQL中执行相同的查询时,它可以正常工作。
ERROR SqlExceptionHelper ERROR: operator does not exist: jsonb = character varying
  Hint: No operator matches the given name and argument types. You might need to add explicit type casts.

通过这些代码片段,有可能发现我做错了什么吗?


看起来 jsonb 在 Hibernate 中没有得到支持,但是(显然)我们可以采用/自定义:https://thorben-janssen.com/persist-postgresqls-jsonb-data-type-hibernate/ (或者 https://www.google.com/search?q=hibernate+jsonb) - xerx593
@xerx593 你说得对。那正是我已经在使用的。 - André Luiz
2个回答

1
我找到了解决方法。这是我的代码库:

public interface AuthorityRepository  extends JpaRepository<Authority, Integer>, JpaSpecificationExecutor<Authority> {

    @Query(
            value = "SELECT * FROM my_tables where marc @> CAST(:jsonString as jsonb)",
            nativeQuery = true
    )
    List<Authority> findAuthoritiesByJsonProperty(@Param("jsonString")  String jsonString);
}

这是我查询的方式:
public List<Authority> getAuthoritiesByControlNumber(String controlNumber) {
    return this.repo.findAuthoritiesByJsonProperty("{\"controlNumber\": \""+ controlNumber +"\"}");
}

0

对我而言,将 -> 替换为 ->> 后,类似的查询可以工作。

因此,在你的情况下,应该这样写:

@Query(
        value = "SELECT * FROM my_table where marc ->> 'controlNumber' = :controlNumber",
        nativeQuery = true
)
List<Authority> findAuthoritiesByControlNumber(@Param("controlNumber") String controlNumber);
}

这是我的查询:
@Query(nativeQuery = true, value = "SELECT * FROM myschema.mytable WHERE myjsonbcolomn ->> 'order_number' = :orderNumber")
  List<InvoiceDao> findByOrderNumber(@Param("orderNumber") String orderNumber);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接