Consider target type when calling getAllOf(…).

We now accept a type hint when calling getAllOf(…) to avoid materializing null instances when the actual type hint cannot resolve to an entity.

Closes #1995
Original Pull Request: #1996
This commit is contained in:
Mark Paluch
2021-03-11 15:36:48 +01:00
committed by Christoph Strobl
parent 754fac92be
commit e496c19021
3 changed files with 42 additions and 6 deletions

View File

@@ -373,16 +373,21 @@ public class RedisKeyValueAdapter extends AbstractKeyValueAdapter
*/
@Override
public List<?> getAllOf(String keyspace) {
return getAllOf(keyspace, -1, -1);
return getAllOf(keyspace, Object.class, -1, -1);
}
public List<?> getAllOf(String keyspace, long offset, int rows) {
@Override
public <T> Iterable<T> getAllOf(String keyspace, Class<T> type) {
return getAllOf(keyspace, type, -1, -1);
}
public <T> List<T> getAllOf(String keyspace, Class<T> type, long offset, int rows) {
byte[] binKeyspace = toBytes(keyspace);
Set<byte[]> ids = redisOps.execute((RedisCallback<Set<byte[]>>) connection -> connection.sMembers(binKeyspace));
List<Object> result = new ArrayList<>();
List<T> result = new ArrayList<>();
List<byte[]> keys = new ArrayList<>(ids);
if (keys.isEmpty() || keys.size() < offset) {
@@ -395,7 +400,7 @@ public class RedisKeyValueAdapter extends AbstractKeyValueAdapter
}
for (byte[] key : keys) {
result.add(get(key, keyspace));
result.add(get(key, keyspace, type));
}
return result;
}

View File

@@ -80,7 +80,7 @@ class RedisQueryEngine extends QueryEngine<RedisKeyValueAdapter, RedisOperationC
if (criteria == null
|| (CollectionUtils.isEmpty(criteria.getOrSismember()) && CollectionUtils.isEmpty(criteria.getSismember()))
&& criteria.getNear() == null) {
return (Collection<T>) getAdapter().getAllOf(keyspace, offset, rows);
return getAdapter().getAllOf(keyspace, type, offset, rows);
}
RedisCallback<Map<byte[], Map<byte[], byte[]>>> callback = connection -> {