Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/399.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何使用Spring数据JPA查询更新PostgreSQL中的JSONB列_Java_Postgresql_Jpa_Spring Data Jpa_Jsonb - Fatal编程技术网

Java 如何使用Spring数据JPA查询更新PostgreSQL中的JSONB列

Java 如何使用Spring数据JPA查询更新PostgreSQL中的JSONB列,java,postgresql,jpa,spring-data-jpa,jsonb,Java,Postgresql,Jpa,Spring Data Jpa,Jsonb,我有以下控制器 @RequestMapping(value = "/update/{tableId}", method = RequestMethod.PUT, produces = MediaType.APPLICATION_JSON_VALUE, consumes = MediaType.APPLICATION_JSON_VALUE) public ResponseEntity updateItemQty (@PathVariable Long tableId

我有以下控制器

@RequestMapping(value = "/update/{tableId}", method = RequestMethod.PUT, produces = MediaType.APPLICATION_JSON_VALUE,
            consumes = MediaType.APPLICATION_JSON_VALUE)
    public ResponseEntity updateItemQty (@PathVariable Long tableId, @RequestBody AddItemsRequestBody requestBody,
                                              HttpServletRequest request){
        try {
            String addedBy = getUserName(request);
            Float ItemQuantity = requestBody.getItemQuantity();
            LocalDateTime dateTimeAdded = LocalDateTime.now();
            String subId = requestBody.getItemSubId();
            ArrayList<ItemAdditionDetails> updatedAdditionDetails = new ArrayList<>();

        ItemAdditionDetails newItemAdditionDetails = new ItemAdditionDetails();
        newItemAdditionDetails.setIncreamentCount(ItemQuantity);
        newItemAdditionDetails.setAddedDateTime(dateTimeAdded);
        newItemAdditionDetails.setAddedBy(addedBy);

        updatedAdditionDetails.add(newItemAdditionDetails);

// Here i am fetching a JSON-B column that returns an array of json objects from Postgress DB  
     ItemInventoryService.findByItemSubId(subId).getItemsInventoryAdditionDetails().forEach((el) -> {
                updatedAdditionDetails.add(el);
            });

        itemInventoryService.updateItemsAdditionDetails(subId,updatedAdditionDetails);

        return new ResponseEntity("Updated", HttpStatus.CREATED);
    }catch (Exception ex){
        return new ResponseEntity(ex, HttpStatus.INTERNAL_SERVER_ERROR);
    }

}
也就是说,如果我不将获取的结果添加到新的UpdateAdditionDetails(ArrayList类型)中,则DB将成功更新 否则我会得到以下错误:

错误:列\“itemsinventory\u addition\u details\”的类型为jsonb,但表达式的类型为record\n提示:您需要重写或强制转换表达式。\n

在我的存储库中,我有以下查询

@Transactional
    @Modifying
    @Query(value = "UPDATE items_inventory  SET itemsinventory_addtion_details = :updatedAdditionDetails WHERE item_subid = :subId", nativeQuery = true)
    Integer updateItemsAdditionDetails(@Param("subId") String subId, @Param("updatedAdditionDetails") List<ItemAdditionDetails> updatedAdditionDetails);
不幸的是,这也导致了同样的错误。 在此方面的任何帮助都将不胜感激。 提前感谢。

错误原因 PostgreSQL错误如下所示:

 @Query(value = "UPDATE ItemsInventory items  SET items.itemsInventoryAdditionDetails = :updatedAdditionDetails WHERE items.itemSubId = :subId")
错误:“itemsinventory\u Addition\u details”列的类型为jsonb,但表达式的类型为record\n提示:您需要重写或强制转换表达式。\n

导致此错误的原因是
列表的传递方式如下所示:

UPDATE
    ItemsInventory items
SET
    items.itemsInventoryAdditionDetails = (?, ?, ?, .., ?)
WHERE
    items.itemSubId = ?
默认情况下,使用Hibernate的SpringDataJPA不知道如何处理JSON类型。因此,您需要使用自定义的Hibernate类型,如项目提供的

Maven依赖 首先,您需要添加Hibernate类型依赖项:

<dependency>
    <groupId>com.vladmihalcea</groupId>
    <artifactId>hibernate-types-52</artifactId>
    <version>${hibernate-types.version}</version>
</dependency>

就这样

您可以添加您的jpabean定义吗?这里可能会有帮助对不起,只是注意到您在这里没有使用实体bean。不过,请参见上面的链接。谢谢您的输入。对于上述实现,查询返回null。在my ItemInventoryRepositoryCustom
int UpdateItemAdditionDetails(字符串子ID,列表UpdateAdditionDetails)中在我的ItemInventoryRepositoryImpl中,我实现了上述建议的方法。最后,我的JPA repo
公共接口ItemInventoryRepository扩展了JPA repository,ItemInventoryRepositoryCustom{}
查询返回
“message”:null,“supprested”:[],“localizedMessage”:null
我在这里做错了什么。不客气。我相信你现在会找到解决办法的。这只是调试问题的问题。
<dependency>
    <groupId>com.vladmihalcea</groupId>
    <artifactId>hibernate-types-52</artifactId>
    <version>${hibernate-types.version}</version>
</dependency>
public int updateItemsAdditionDetails(
    String subId, 
    List<ItemAdditionDetails> updatedAdditionDetails) {
    return entityManager.createNativeQuery(
        "UPDATE items_inventory  SET itemsinventory_addtion_details = :updatedAdditionDetails WHERE item_subid = :subId")
    .unwrap(NativeQuery.class)
    .setParameter("updatedAdditionDetails", updatedAdditionDetails, JsonBinaryType.INSTANCE)
    .setParameter("subId", subId)
    .executeUpdate();
}