From cca1a95b5ac1d1ae85307668929d4733cc79c81b Mon Sep 17 00:00:00 2001 From: godotg Date: Mon, 17 Jun 2024 10:30:59 +0800 Subject: [PATCH] fix[orm]: map null value support --- .../java/com/zfoo/orm/codec/IntMapCodec.java | 10 ++++++++-- .../java/com/zfoo/orm/codec/LongMapCodec.java | 19 +++++++++++++++---- .../java/com/zfoo/orm/accessor/MapTest.java | 2 ++ 3 files changed, 25 insertions(+), 6 deletions(-) diff --git a/orm/src/main/java/com/zfoo/orm/codec/IntMapCodec.java b/orm/src/main/java/com/zfoo/orm/codec/IntMapCodec.java index 841a272e..31d553d1 100644 --- a/orm/src/main/java/com/zfoo/orm/codec/IntMapCodec.java +++ b/orm/src/main/java/com/zfoo/orm/codec/IntMapCodec.java @@ -32,8 +32,14 @@ public class IntMapCodec implements Codec> { public void encode(final BsonWriter writer, final Map map, final EncoderContext encoderContext) { writer.writeStartDocument(); for (var entry : map.entrySet()) { - writer.writeName(entry.getKey().toString()); - valueCodec.encode(writer, entry.getValue(), encoderContext); + var key = entry.getKey(); + var value = entry.getValue(); + writer.writeName(key.toString()); + if (value == null) { + writer.writeNull(); + } else { + valueCodec.encode(writer, entry.getValue(), encoderContext); + } } writer.writeEndDocument(); } diff --git a/orm/src/main/java/com/zfoo/orm/codec/LongMapCodec.java b/orm/src/main/java/com/zfoo/orm/codec/LongMapCodec.java index 62dc76c0..4fb3b5da 100644 --- a/orm/src/main/java/com/zfoo/orm/codec/LongMapCodec.java +++ b/orm/src/main/java/com/zfoo/orm/codec/LongMapCodec.java @@ -31,9 +31,15 @@ public class LongMapCodec implements Codec> { @Override public void encode(final BsonWriter writer, final Map map, final EncoderContext encoderContext) { writer.writeStartDocument(); - for (final Map.Entry entry : map.entrySet()) { - writer.writeName(entry.getKey().toString()); - valueCodec.encode(writer, entry.getValue(), encoderContext); + for (var entry : map.entrySet()) { + var key = entry.getKey(); + var value = entry.getValue(); + writer.writeName(key.toString()); + if (value == null) { + writer.writeNull(); + } else { + valueCodec.encode(writer, entry.getValue(), encoderContext); + } } writer.writeEndDocument(); } @@ -44,7 +50,12 @@ public class LongMapCodec implements Codec> { var map = new HashMap(); while (!BsonType.END_OF_DOCUMENT.equals(reader.readBsonType())) { long key = Long.parseLong(reader.readName()); - V value = BsonType.NULL.equals(reader.getCurrentBsonType()) ? null : valueCodec.decode(reader, context); + V value = null; + if (BsonType.NULL.equals(reader.getCurrentBsonType())) { + reader.readNull(); + } else { + value = valueCodec.decode(reader, context); + } map.put(key, value); } reader.readEndDocument(); diff --git a/orm/src/test/java/com/zfoo/orm/accessor/MapTest.java b/orm/src/test/java/com/zfoo/orm/accessor/MapTest.java index 290cf1f0..ae31bbed 100644 --- a/orm/src/test/java/com/zfoo/orm/accessor/MapTest.java +++ b/orm/src/test/java/com/zfoo/orm/accessor/MapTest.java @@ -55,6 +55,7 @@ public class MapTest { bagMap.put("bag1", bagItem1); bagMap.put("bag2", bagItem2); bagMap.put("bag3", bagItem3); + bagMap.put("bag4", null); var map = new HashMap>(); map.put("a", Map.of("b", "b")); @@ -63,6 +64,7 @@ public class MapTest { var longStringHashMap = new HashMap(); longStringHashMap.put(100L, "hello map1"); longStringHashMap.put(101L, "hello map2"); + longStringHashMap.put(102L, null); entity.setLongStringMap(longStringHashMap); var intStringHashMap = new HashMap();