diff --git a/core/testsuite/src/test/java/com/blazebit/persistence/testsuite/SelectNewTest.java b/core/testsuite/src/test/java/com/blazebit/persistence/testsuite/SelectNewTest.java index d9f420dd00..a74dcba853 100644 --- a/core/testsuite/src/test/java/com/blazebit/persistence/testsuite/SelectNewTest.java +++ b/core/testsuite/src/test/java/com/blazebit/persistence/testsuite/SelectNewTest.java @@ -23,6 +23,7 @@ import com.blazebit.persistence.testsuite.model.DocumentCount; import com.blazebit.persistence.testsuite.model.DocumentPartnerView; import com.blazebit.persistence.testsuite.model.DocumentViewModel; +import com.blazebit.persistence.testsuite.model.PersonModel; import com.blazebit.persistence.testsuite.tx.TxVoidWork; import org.junit.Test; @@ -117,6 +118,36 @@ public void testSelectNewSubquery() { assertEquals((long) expectedCount, actual.size()); } + @Test + public void testSelectNewSubqueryPrecededByOtherItem() { + CriteriaBuilder crit = cbf.create(em, Person.class, "p") + .selectNew(PersonModel.class) + .with("p.name") + .withSubquery().from(Document.class).select("COUNT(document.id)").whereExpression("document.owner = p").end() + .end(); + + assertEquals("SELECT p.name, (SELECT COUNT(document.id) FROM Document document WHERE document.owner = p) FROM Person p", crit.getQueryString()); + List actual = crit.getResultList(); + + assertEquals(1L, actual.size()); + assertEquals(Long.valueOf(2), actual.get(0).getDocumentCount()); + } + + @Test + public void testSelectNewSubqueryFollowedByOtherItem() { + CriteriaBuilder crit = cbf.create(em, Person.class, "p") + .selectNew(PersonModel.class) + .withSubquery().from(Document.class).select("COUNT(document.id)").whereExpression("document.owner = p").end() + .with("p.name") + .end(); + + assertEquals("SELECT (SELECT COUNT(document.id) FROM Document document WHERE document.owner = p), p.name FROM Person p", crit.getQueryString()); + List actual = crit.getResultList(); + + assertEquals(1L, actual.size()); + assertEquals(Long.valueOf(2), actual.get(0).getDocumentCount()); + } + @Test public void testSelectCollection() { CriteriaBuilder criteria = cbf.create(em, Document.class, "d") diff --git a/core/testsuite/src/test/java/com/blazebit/persistence/testsuite/model/PersonModel.java b/core/testsuite/src/test/java/com/blazebit/persistence/testsuite/model/PersonModel.java new file mode 100755 index 0000000000..ccfd5f9baf --- /dev/null +++ b/core/testsuite/src/test/java/com/blazebit/persistence/testsuite/model/PersonModel.java @@ -0,0 +1,51 @@ +/* + * Copyright 2014 - 2023 Blazebit. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.blazebit.persistence.testsuite.model; + +/** + * @author Christian Graefe + * @since 1.6.9 + */ +public class PersonModel +{ + + private final String name; + + private final Long documentCount; + + public PersonModel(String name, Long documentCount) + { + this.name = name; + this.documentCount = documentCount; + } + + public PersonModel(Long documentCount, String name) + { + this.name = name; + this.documentCount = documentCount; + } + + public String getName() + { + return name; + } + + public Long getDocumentCount() + { + return documentCount; + } +}