是否存在Lombok注解可将复合主键类对象所有字段转为Object数组?
解决方案:Lombok无原生支持,可通过这些方式实现
目前Lombok并没有原生注解或配置组合能直接生成你需要的getForVarArgs()方法,不过可以通过以下几种方式批量实现需求:
1. 通用反射工具类(最省心)
写一个全局工具类,通过反射提取复合主键类的所有字段值,不用给每个主键类单独写方法:
public class PrimaryKeyUtils { public static Object[] toVarArgs(Object primaryKey) { Field[] fields = primaryKey.getClass().getDeclaredFields(); Object[] args = new Object[fields.length]; try { for (int i = 0; i < fields.length; i++) { fields[i].setAccessible(true); args[i] = fields[i].get(primaryKey); } } catch (IllegalAccessException e) { throw new RuntimeException("提取主键字段失败", e); } return args; } }
调用时直接传入主键对象:
jdbcTemplate.query( READ_ITEM_BY_PK_QUERY, new BeanPropertyRowMapper<>(Item.class), PrimaryKeyUtils.toVarArgs(itemPrimaryKey));
2. 抽象基类继承
定义一个抽象基类,实现getForVarArgs()方法,所有复合主键类继承它即可:
public abstract class BaseCompositeKey { public Object[] getForVarArgs() { Field[] fields = this.getClass().getDeclaredFields(); Object[] args = new Object[fields.length]; try { for (int i = 0; i < fields.length; i++) { fields[i].setAccessible(true); args[i] = fields[i].get(this); } } catch (IllegalAccessException e) { throw new RuntimeException("提取主键字段失败", e); } return args; } }
主键类继承基类:
@Value public class ItemPrimaryKey extends BaseCompositeKey { String compositeKeyColumnA; String compositeKeyColumnB; String compositeKeyColumnC; String compositeKeyColumnD; }
调用方式和你之前的简化版一致:
jdbcTemplate.query( READ_ITEM_BY_PK_QUERY, new BeanPropertyRowMapper<>(Item.class), itemPrimaryKey.getForVarArgs());
3. 手动编写方法(性能最优)
如果主键类数量不多,或者担心反射的性能开销,直接给每个主键类手动实现getForVarArgs()方法是最直接的方式——虽然有重复代码,但逻辑清晰,没有反射带来的额外开销。
内容的提问来源于stack exchange,提问作者Stoyko Stoev
相关产品推荐
相关产品推荐

