簡體   English   中英

JPA和JSON運算符本機查詢

[英]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類型)。

http://rextester.com/AUHP11519

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM