diff --git a/src/test/java/org/tests/inheritance/TestInheritanceRawSql.java b/src/test/java/org/tests/inheritance/TestInheritanceRawSql.java index 5b7d88620..a7cd1a4ab 100644 --- a/src/test/java/org/tests/inheritance/TestInheritanceRawSql.java +++ b/src/test/java/org/tests/inheritance/TestInheritanceRawSql.java @@ -4,13 +4,18 @@ import io.ebean.BaseTestCase; import io.ebean.Ebean; import io.ebean.RawSql; import io.ebean.RawSqlBuilder; -import org.tests.model.basic.Truck; -import org.tests.model.basic.Vehicle; import org.junit.Assert; import org.junit.Test; +import org.tests.model.basic.Truck; +import org.tests.model.basic.Vehicle; +import org.tests.model.basic.VehicleLeaseLong; +import java.math.BigDecimal; +import java.time.LocalDate; import java.util.List; +import static org.assertj.core.api.Assertions.assertThat; + public class TestInheritanceRawSql extends BaseTestCase { @Test @@ -48,4 +53,63 @@ public class TestInheritanceRawSql extends BaseTestCase { Ebean.save(truck2); } + @Test + public void testJoinToInheritance() { + + VehicleLeaseLong longLease = new VehicleLeaseLong(); + longLease.setName("Long one"); + longLease.setBond(new BigDecimal("1000")); + longLease.setMinDuration(100); + longLease.setActiveEnd(LocalDate.now()); + + Ebean.save(longLease); + + + Truck truck = new Truck(); + truck.setCapacity(100D); + truck.setLicenseNumber("ZK1"); + truck.setLease(longLease); + + Ebean.save(truck); + + + String sql = "select v.dtype, v.id, v.license_number, l.dtype, l.id, l.name " + + "from vehicle v " + + "join vehicle_lease l on l.id = v.lease_id " + + "where v.id = ?"; + + RawSql rawSql = RawSqlBuilder.parse(sql) + .tableAliasMapping("v", null) + .tableAliasMapping("l", "lease") + .create(); + + Vehicle veh = Ebean.find(Vehicle.class) + .setRawSql(rawSql) + .setParameter(1, truck.getId()) + .findOne(); + + assertThat(veh).isNotNull(); + assertThat(veh.getLicenseNumber()).isEqualTo("ZK1"); + assertThat(veh.getLease().getName()).isEqualTo("Long one"); + + + RawSql rawSql2 = RawSqlBuilder.parse(sql) + .columnMappingIgnore("v.dtype") + .columnMapping("v.id", "id") + .columnMapping("v.license_number", "licenseNumber") + .columnMappingIgnore("l.dtype") + .columnMapping("l.id", "lease.id") + .columnMapping("l.name", "lease.name") + .create(); + + Vehicle veh2 = Ebean.find(Vehicle.class) + .setRawSql(rawSql2) + .setParameter(1, truck.getId()) + .findOne(); + + assertThat(veh2).isNotNull(); + assertThat(veh2.getLicenseNumber()).isEqualTo("ZK1"); + assertThat(veh2.getLease().getName()).isEqualTo("Long one"); + } + } diff --git a/src/test/java/org/tests/model/basic/Vehicle.java b/src/test/java/org/tests/model/basic/Vehicle.java index 4da993c42..cab8c4dde 100644 --- a/src/test/java/org/tests/model/basic/Vehicle.java +++ b/src/test/java/org/tests/model/basic/Vehicle.java @@ -3,6 +3,7 @@ package org.tests.model.basic; import javax.persistence.DiscriminatorColumn; import javax.persistence.Entity; import javax.persistence.Inheritance; +import javax.persistence.ManyToOne; import java.util.Date; @Entity @@ -19,6 +20,9 @@ public abstract class Vehicle extends BasicDomain { // @Transient private transient String testTransient; + @ManyToOne + private VehicleLease lease; + public String getLicenseNumber() { return licenseNumber; } @@ -42,4 +46,12 @@ public abstract class Vehicle extends BasicDomain { public void setTestTransient(String testTransient) { this.testTransient = testTransient; } + + public VehicleLease getLease() { + return lease; + } + + public void setLease(VehicleLease lease) { + this.lease = lease; + } } diff --git a/src/test/java/org/tests/model/basic/VehicleLease.java b/src/test/java/org/tests/model/basic/VehicleLease.java new file mode 100644 index 000000000..1aa7b703d --- /dev/null +++ b/src/test/java/org/tests/model/basic/VehicleLease.java @@ -0,0 +1,64 @@ +package org.tests.model.basic; + +import javax.persistence.Entity; +import javax.persistence.Id; +import javax.persistence.Inheritance; +import javax.persistence.Version; +import java.time.LocalDate; + +@Entity +@Inheritance +public abstract class VehicleLease { + + @Id + long id; + + String name; + + LocalDate activeStart; + + LocalDate activeEnd; + + @Version + long version; + + public long getId() { + return id; + } + + public void setId(long id) { + this.id = id; + } + + public long getVersion() { + return version; + } + + public void setVersion(long version) { + this.version = version; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public LocalDate getActiveStart() { + return activeStart; + } + + public void setActiveStart(LocalDate activeStart) { + this.activeStart = activeStart; + } + + public LocalDate getActiveEnd() { + return activeEnd; + } + + public void setActiveEnd(LocalDate activeEnd) { + this.activeEnd = activeEnd; + } +} diff --git a/src/test/java/org/tests/model/basic/VehicleLeaseLong.java b/src/test/java/org/tests/model/basic/VehicleLeaseLong.java new file mode 100644 index 000000000..4af74793f --- /dev/null +++ b/src/test/java/org/tests/model/basic/VehicleLeaseLong.java @@ -0,0 +1,32 @@ +package org.tests.model.basic; + +import javax.persistence.DiscriminatorValue; +import javax.persistence.Entity; +import javax.persistence.Inheritance; +import java.math.BigDecimal; + +@Entity +@Inheritance +@DiscriminatorValue("LONG") +public class VehicleLeaseLong extends VehicleLease { + + BigDecimal bond; + + int minDuration; + + public BigDecimal getBond() { + return bond; + } + + public void setBond(BigDecimal bond) { + this.bond = bond; + } + + public int getMinDuration() { + return minDuration; + } + + public void setMinDuration(int minDuration) { + this.minDuration = minDuration; + } +} diff --git a/src/test/java/org/tests/model/basic/VehicleLeaseShort.java b/src/test/java/org/tests/model/basic/VehicleLeaseShort.java new file mode 100644 index 000000000..6e5ccbee5 --- /dev/null +++ b/src/test/java/org/tests/model/basic/VehicleLeaseShort.java @@ -0,0 +1,33 @@ +package org.tests.model.basic; + +import javax.persistence.DiscriminatorValue; +import javax.persistence.Entity; +import javax.persistence.Inheritance; +import java.math.BigDecimal; + +@Entity +@Inheritance +@DiscriminatorValue("SHORT") +public class VehicleLeaseShort extends VehicleLease { + + + BigDecimal dayRate; + + Integer maxDays; + + public BigDecimal getDayRate() { + return dayRate; + } + + public void setDayRate(BigDecimal dayRate) { + this.dayRate = dayRate; + } + + public Integer getMaxDays() { + return maxDays; + } + + public void setMaxDays(Integer maxDays) { + this.maxDays = maxDays; + } +}