7

我试图让这个查询在 JPA 中工作:

SELECT * FROM contrat WHERE contrat_json @> '{"nom" :"hever"}';

它完美地工作,postgresql但是当我将它与 JPA 集成时,我收到以下错误:

具有该位置 [1] 的参数不存在

我的代码:

 @Transactional
 @Query(nativeQuery = true,value = "select p from Contrat p where contrat_json @> '{\"nom\":\":nom\"}'")
    public List<Contrat> findByNomRestrict(@Param("nom") String nom);

我认为它无法识别@>,尽管本机查询,你有什么想法吗?

4

3 回答 3

3

我的本机查询有类似的问题。jsonb 字段名叫做data,很简单

{ 
   "name" : "genderList", 
   "displayName" : "gender list" 
}

我想用 JpaRepository 按名称查找,这是我的存储库

@Repository
public interface LookupListRepository extends JpaRepository<LookupList, UUID>
{
    @Query(value = "SELECT * FROM lookup_list WHERE data->>'name' = :name", 
            nativeQuery = true)
    List<LookupList> findByName(@Param("name") String name);
}

你需要nativeQuery = true。使用nativeQuery = true,这也适用。

SELECT * FROM lookup_list WHERE jsonb_extract_path_text(data, 'name') = :name

我看到您的 @Transactional 注释,我假设您在应用程序服务方法之上具有本机查询。您可以尝试移动存储库中的所有本机查询并使用 JpaRepository,并在您的应用程序服务中使用存储库方法吗?以下是我的应用程序服务如何使用存储库。

public class LookupListServiceImpl implements LookupListService
{
    @Autowired
    LookupListRepository lookupListRepository;

    @Override
    @Transactional
    public void changeLookupList(LookupListDto lookupListDto)
    {
        List<LookupList> lookupLists = lookupListRepository.findByName(lookupListDto.getName());
        ...
    }

}

JPA 存储库参考 http://docs.spring.io/spring-data/jpa/docs/1.3.0.RELEASE/reference/html/jpa.repositories.html

于 2017-06-27T19:21:20.127 回答
3

参数持有者在文字内部不被理解:'...:nom...'将包含字符:nom,而不是 的绑定值nom

对于 PostgreSQL 9.5(及更高版本),使用:

SELECT * FROM contrat WHERE contrat_json @> jsonb_build_object('nom', :nom)

对于 9.4:

SELECT * FROM contrat WHERE contrat_json @> CAST(json_build_object('nom', :nom) AS jsonb)

对于 9.3(及更早版本),没有 JSON 包含运算符(没有jsonb类型)。

http://rextester.com/AUHP11519

于 2017-03-20T14:31:44.963 回答
2

使用 PostgreSQL 和 JSON,您可能会遇到需要?或其他奇怪的运算符,因此最好只使用它们的等效函数。psql您可以像这样在控制台中查找它们\doS+ @>

正如参数所说,您的查询不是本机查询。

select p from Contrat p where...

当它到达数据库时只会给你一个错误。

尝试类似的东西

@Query(nativeQuery = true, value = "select * from Contrat where jsonb_contains(contrat_json, :nom )")

"{\"nom\":\"" + param + "\"}"并作为参数绑定

于 2017-03-20T13:58:25.623 回答