【JAVA基础】遍历list<Entity>,获取id数组

本文介绍如何使用Hibernate JPA实现查询指定资产ID的所有历史记录,包括编写查询语句及参数处理的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、需求

     从资产历史表中,查出资产id是“1”的所有历史资产。


二、思路

     我们使用hibernate做的jpa的实现,在IDao中写这样的查询语句:

@Query(value = "select p from AssetInfoHist p where p.assetId in ?1")
	public List<AssetInfoHist> queryListByAssetIds(String[] assetIds);
         查询参数 ids是数组的格式,所以需要遍历list<Entity>,获取id数组;


三、代码:

String[] assetIds = new String[assetInfoHists.size()];
int index = 0;
if (null != assetInfoHists) {
	for (AssetInfoHist assetInfoHist : assetInfoHists) {
		assetIds [index ++] = assetInfoHist .getAssetId();
	}
			
}


当然,也可以使用将List<String> 转成String[] 的方法。

        Sql语句在任何时候都是必须掌握的

package com.kucun.data.entity.DTO; import com.fasterxml.jackson.core.JsonGenerator; import com.fasterxml.jackson.databind.JsonSerializer; import com.fasterxml.jackson.databind.SerializerProvider; import com.fasterxml.jackson.databind.ser.std.StdSerializer; import com.kucun.data.entity.EntityBasis; import java.io.IOException; import java.lang.reflect.Field; import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.HashMap; public class FullEntitySerializer extends JsonSerializer<Object> { @Override public void serialize(Object value, JsonGenerator gen, SerializerProvider provider) throws IOException { // 处理 List<EntityBasis> 类型 if (value instanceof List) { handleEntityBasisList((List<?>) value, gen, provider); } // 处理单个 EntityBasis 对象 else if (value instanceof EntityBasis) { handleSingleEntityBasis((EntityBasis) value, gen, provider); } // 其他类型使用默认序列化 else { provider.defaultSerializeValue(value, gen); } } // 处理单个 EntityBasis 对象 private void handleSingleEntityBasis(EntityBasis entity, JsonGenerator gen, SerializerProvider provider) throws IOException { gen.writeStartObject(); Field[] fields = entity.getClass().getDeclaredFields(); for (Field field : fields) { field.setAccessible(true); try { Object fieldValue = field.get(entity); String fieldName = field.getName(); // 处理 EntityBasis 类型字段 if (fieldValue instanceof EntityBasis) { Map<String , Integer> map=new HashMap<String, Integer>(); map.put("id", ((EntityBasis) fieldValue).getId()); gen.writeObjectField(fieldName,map); } // 处理 List<EntityBasis> 类型字段 else if (fieldValue instanceof List) { handleEntityBasisListField((List<?>) fieldValue, fieldName, gen); } // 处理其他类型字段 else { provider.defaultSerializeValue(fieldValue, gen); } } catch (IllegalAccessException e) { // 跳过无法访问的字段 } } gen.writeEndObject(); } // 处理 List<EntityBasis> 集合 private void handleEntityBasisList(List<?> list, JsonGenerator gen, SerializerProvider provider) throws IOException { gen.writeStartArray(); for (Object item : list) { if (item instanceof EntityBasis) { handleSingleEntityBasis((EntityBasis) item, gen, provider); } else { provider.defaultSerializeValue(item, gen); } } gen.writeEndArray(); } // 处理 List<EntityBasis> 类型字段 private void handleEntityBasisListField(List<?> list, String fieldName, JsonGenerator gen) throws IOException { if (list.isEmpty() || !(list.get(0) instanceof EntityBasis)) { gen.writeFieldName(fieldName); gen.writeNull(); return; } List<Map<String, Integer>> idList = new ArrayList<>(); for (Object item : list) { if (item instanceof EntityBasis) { Map<String, Integer> idMap = new HashMap<>(); idMap.put("id", ((EntityBasis) item).getId()); idList.add(idMap); } } gen.writeObjectField(fieldName, idList); } }25-06-13 14:29:35.318 DEBUG 13316 — [nio-8080-exec-3] .m.m.a.ExceptionHandlerExceptionResolver : Resolved [org.springframework.http.converter.HttpMessageNotWritableException: Could not write JSON: Can not start an object, expecting field name (context: Object); nested exception is com.fasterxml.jackson.core.JsonGenerationException: Can not start an object, expecting field name (context: Object)] 2025-06-13 14:29:35.323 DEBUG 13316 — [nio-8080-exec-3] o.s.web.servlet.DispatcherServlet : Completed 500 INTERNAL_SERVER_ERROR
06-14
评论 27
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小王师傅66

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值