[英]JPA and JSON operator native query
我正在尝试使此查询在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);
我认为它不承认@>
尽管本机查询,你有什么想法吗?
使用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 + "\\"}"
绑定为参数
我的原生查询遇到了类似的问题。 jsonb字段名称称为数据 ,它很简单
{
"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
参数持有人不明白里面的文字: '...: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
类型)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.