diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanDescriptor.java b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanDescriptor.java index 325213933..eba1eea95 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanDescriptor.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanDescriptor.java @@ -208,6 +208,7 @@ public class BeanDescriptor implements BeanType, STreeType, SpiBeanType { private final EntityBean prototypeEntityBean; private final IdBinder idBinder; + private final String idSelect; private String idBinderInLHSSql; private String idBinderIdSql; private String deleteByIdSql; @@ -349,6 +350,23 @@ public class BeanDescriptor implements BeanType, STreeType, SpiBeanType { propertiesIndex[i] = propMap.get(ebi.getProperty(i)); } } + idSelect = initIdSelect(); + } + + String initIdSelect() { + if (idProperty != null && !idProperty.name().equals("_idClass")) { + return idProperty.name(); + } else if (entityType == EntityType.EMBEDDED) { + return null; + } else { + StringJoiner sj = new StringJoiner(","); + for (BeanProperty prop : propertiesNonMany) { + if (prop.isImportedPrimaryKey()) { + sj.add(prop.name()); + } + } + return sj.toString().intern(); + } } public boolean isJacksonCorePresent() { @@ -3011,6 +3029,10 @@ public class BeanDescriptor implements BeanType, STreeType, SpiBeanType { return idProperty; } + public String idSelect() { + return idSelect; + } + /** * Return true if this bean should be inserted rather than updated. * diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanDescriptorElement.java b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanDescriptorElement.java index c69fbb265..938a4c3d4 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanDescriptorElement.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/deploy/BeanDescriptorElement.java @@ -23,6 +23,11 @@ abstract class BeanDescriptorElement extends BeanDescriptor { this.elementHelp = elementHelp; } + @Override + String initIdSelect() { + return null; + } + private String shortName(String name) { int pos = name.lastIndexOf('.'); if (pos > 1) { diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/querydefn/DefaultOrmQuery.java b/ebean-core/src/main/java/io/ebeaninternal/server/querydefn/DefaultOrmQuery.java index 5b700d3f6..307b2713c 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/querydefn/DefaultOrmQuery.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/querydefn/DefaultOrmQuery.java @@ -586,9 +586,9 @@ public final class DefaultOrmQuery extends AbstractQuery implements SpiQuery< */ @Override public void setSelectId() { - // clear select and fetch joins.. + // clear select and fetch joins detail.clear(); - select(beanDescriptor.idBinder().getIdProperty()); + select(beanDescriptor.idSelect()); } @Override diff --git a/ebean-test/src/test/java/org/tests/model/bridge/TestIdClassScalar.java b/ebean-test/src/test/java/org/tests/model/bridge/TestIdClassScalar.java index 78952eb7a..2cedcc84d 100644 --- a/ebean-test/src/test/java/org/tests/model/bridge/TestIdClassScalar.java +++ b/ebean-test/src/test/java/org/tests/model/bridge/TestIdClassScalar.java @@ -6,18 +6,19 @@ import io.ebean.Transaction; import io.ebean.test.LoggedSql; import org.junit.jupiter.api.Test; +import java.util.Arrays; import java.util.List; import java.util.UUID; import static org.assertj.core.api.Assertions.assertThat; -public class TestIdClassScalar extends BaseTestCase { +class TestIdClassScalar extends BaseTestCase { - private BUser user = new BUser("Fiona"); - private BSite site = new BSite("avaje.io"); + private final BUser user = new BUser("Fiona"); + private final BSite site = new BSite("avaje.io"); @Test - public void testBEmbId_equalsHashcode() { + void testBEmbId_equalsHashcode() { BEmbId a = new BEmbId(UUID.randomUUID(), UUID.randomUUID()); BEmbId b = new BEmbId(a.getSiteId(), a.getUserId()); @@ -35,13 +36,11 @@ public class TestIdClassScalar extends BaseTestCase { assertThat(a).isNotEqualTo(d); assertThat(a.hashCode()).isNotEqualTo(d.hashCode()); - assertThat(a.hashCode()).isEqualTo(a.otherHash()); - } @Test - public void fetchMany() { + void fetchMany() { UUID siteId = UUID.randomUUID(); UUID userId = UUID.randomUUID(); @@ -59,7 +58,7 @@ public class TestIdClassScalar extends BaseTestCase { } @Test - public void insertBatch() { + void insertBatch() { UUID siteId = UUID.randomUUID(); UUID userId = UUID.randomUUID(); @@ -81,11 +80,9 @@ public class TestIdClassScalar extends BaseTestCase { } @Test - public void test() { - + void test() { DB.save(user); DB.save(site); - insertUpdateBridgeD(user, site); insertUpdateBridgeE(user, site); } @@ -94,7 +91,6 @@ public class TestIdClassScalar extends BaseTestCase { * Test where matching by db column naming convention. */ private void insertUpdateBridgeD(BUser user, BSite site) { - LoggedSql.start(); BSiteUserD access = new BSiteUserD(BAccessLevel.ONE, site.id, user.id); @@ -139,7 +135,6 @@ public class TestIdClassScalar extends BaseTestCase { * Test where matching by db column naming convention. */ private void insertUpdateBridgeE(BUser user, BSite site) { - LoggedSql.start(); BSiteUserE access = new BSiteUserE(BAccessLevel.ONE, site, user); @@ -181,4 +176,47 @@ public class TestIdClassScalar extends BaseTestCase { assertSql(sql.get(1)).contains("update bsite_user_e set access_level=? where site_id=? and user_id=?"); } + + @Test + void idClass_existsQuery() { + BUser user = new BUser("JunkUser2"); + BSite site = new BSite("JunkSite2"); + BSiteUserE access = new BSiteUserE(BAccessLevel.ONE, site, user); + + DB.save(user); + DB.save(site); + DB.save(access); + + boolean exists = DB.find(BSiteUserE.class) + .where().eq("user.id", user.id) + .exists(); + + assertThat(exists).isTrue(); + assertThat(DB.find(BSiteUserE.class).where().eq("user.id", user.id).findCount()).isEqualTo(1); + + DB.delete(access); + DB.deleteAll(Arrays.asList(user, site)); + } + + @Test + void idClass_existsQuery_scalarImportedProperties() { + BUser user = new BUser("JunkUser3"); + BSite site = new BSite("JunkSite3"); + DB.save(user); + DB.save(site); + + BSiteUserD access = new BSiteUserD(BAccessLevel.ONE, site.id, user.id); + DB.save(access); + + boolean exists = DB.find(BSiteUserD.class) + .where().eq("userId", user.id) + .exists(); + + assertThat(exists).isTrue(); + assertThat(DB.find(BSiteUserD.class).where().eq("userId", user.id).findCount()).isEqualTo(1); + + DB.delete(access); + DB.deleteAll(Arrays.asList(user, site)); + } + }