I have API get data from 3 table
I use native query in Spring Boot and database MySQL:
@Query(value = "SELECT stock.product_id as productId,two.product_name as productName, two.brand as brand, two.description as description, two.categoryid as categoryName,GROUP_CONCAT(stock.price_stock) as priceStock,GROUP_CONCAT(stock.quantity_stock) as quantityStock,GROUP_CONCAT(stock.size_id) as sizeName,GROUP_CONCAT(stock.color_id) as colorName,two.ims as urlImage\n" +
"FROM stock\n" +
"INNER JOIN ((SELECT product.product_id,product.product_name,product.brand,product.description,product.categoryid,GROUP_CONCAT(product_image.url_image) as ims FROM product INNER JOIN product_image ON product.product_id = product_image.product_id GROUP BY product.product_id)) as two\n" +
"ON stock.product_id = two.product_id\n" +
"GROUP BY stock.product_id",nativeQuery = true)
List<Map<String,Object>> getAllProductAndStock();
This API return data example (not full data):
[
{
"productId": 4,
"colorName": "DarkRed,Violet,Lime,White",
"sizeName": "XL,M,3XL,2XL",
"brand": "LISA",
"quantityStock": "9,13,6,15",
"priceStock": "39,41,39,50",
"productName": "TARTAN PRINT DRESS",
"categoryName": "DRESS",
},
{
"productId": 5,
"categoryName": "Coat",
"colorName": "Gold,Silver,DarkRed",
"productName": "LONG TRENCH COAT",
"sizeName": "L,XL,L",
"quantityStock": "16,5,6",
"brand": "HOODIE",
"priceStock": "94.1,94.1,94.1",
}
]
Now I want to change "colorName","sizeName","quantityStock","priceStock" to list like:
[
{
"productId": 4,
"colorName": [DarkRed,Violet,Lime,White],
"sizeName": [XL,M,3XL,2XL],
"brand": "LISA",
"quantityStock": [9,13,6,15],
"priceStock": [39,41,39,50],
"productName": "TARTAN PRINT DRESS",
"categoryName": "DRESS",
},
{
"productId": 5,
"categoryName": "Coat",
"colorName": [Gold,Silver,DarkRed],
"productName": "LONG TRENCH COAT",
"sizeName": [L,XL,L],
"quantityStock": [16,5,6],
"brand": "HOODIE",
"priceStock": [94.1,94.1,94.1],
}
]
To change to list I code like below:
// data is get data from @Query
List<Map<String,Object>> data = productService.getAllProductsAndStocks();
// This code below change to list
data.stream().collect(Collectors.toList()).forEach(u -> u.entrySet().stream().forEach(k ->{
if(Arrays.asList("colorName","sizeName","quantityStock","priceStock").contains(k.getKey())){
List<?> newData = Arrays.asList(k.getValue().toString().split(","));
System.out.println(newData);
u.put(k.getKey(), newData);
}
}));
But When I run it get error: "A TupleBackedMap cannot be modified". How can I change "colorName","sizeName","quantityStock","priceStock" to list ?
Thanks