From 81e7cbd47599db170d6414f402f815635f99e1b9 Mon Sep 17 00:00:00 2001 From: David Kubecka Date: Tue, 11 Apr 2023 11:17:30 +0200 Subject: [PATCH] [#1722] avoid NPE in TupleTransformatorFactory For some unknown reason a classMappingIndex sometimes points to a non-present field in the tuple (filtered via fetches mechanism). The correct fix should be somewhere else but that this is probably good enough - just don't perfomr any tuple transformation for non-present fields. Also, fix a small bug in hasSubFetches. The wrongly implemented equality check lead to overfetching. --- .../view/impl/objectbuilder/ViewTypeObjectBuilder.java | 2 +- .../transformator/TupleTransformatorFactory.java | 4 +++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/entity-view/impl/src/main/java/com/blazebit/persistence/view/impl/objectbuilder/ViewTypeObjectBuilder.java b/entity-view/impl/src/main/java/com/blazebit/persistence/view/impl/objectbuilder/ViewTypeObjectBuilder.java index 4e0c279793..387cef7e3c 100644 --- a/entity-view/impl/src/main/java/com/blazebit/persistence/view/impl/objectbuilder/ViewTypeObjectBuilder.java +++ b/entity-view/impl/src/main/java/com/blazebit/persistence/view/impl/objectbuilder/ViewTypeObjectBuilder.java @@ -120,6 +120,6 @@ public > void applySelects(X queryBuilder) { private boolean hasSubFetches(String attributePath) { String fetchedPath = fetches.ceiling(attributePath); - return fetchedPath != null && (fetchedPath.length() == attributePath.length() || fetchedPath.startsWith(attributePath) && fetchedPath.length() > attributePath.length() && fetchedPath.charAt(attributePath.length()) == '.'); + return fetchedPath != null && (fetchedPath.equals(attributePath) || fetchedPath.startsWith(attributePath) && fetchedPath.charAt(attributePath.length()) == '.'); } } diff --git a/entity-view/impl/src/main/java/com/blazebit/persistence/view/impl/objectbuilder/transformator/TupleTransformatorFactory.java b/entity-view/impl/src/main/java/com/blazebit/persistence/view/impl/objectbuilder/transformator/TupleTransformatorFactory.java index 522b70a173..7b8839417c 100644 --- a/entity-view/impl/src/main/java/com/blazebit/persistence/view/impl/objectbuilder/transformator/TupleTransformatorFactory.java +++ b/entity-view/impl/src/main/java/com/blazebit/persistence/view/impl/objectbuilder/transformator/TupleTransformatorFactory.java @@ -132,7 +132,9 @@ public int getConsumeEndIndex() { @Override public Object[] transform(Object[] tuple, UpdatableViewMap updatableViewMap) { - if (Arrays.binarySearch(subtypeIndexes, ((Number) tuple[classMappingIndex]).intValue()) >= 0) { + Number index = (Number) tuple[classMappingIndex]; + // FIXME: The null check is just a crude fix for https://github.com/Blazebit/blaze-persistence/issues/1722 + if (index != null && Arrays.binarySearch(subtypeIndexes, index.intValue()) >= 0) { return delegate.transform(tuple, updatableViewMap); } else { return tuple;