From 5a9a1c5a87e9f415000ad7b2452a68a0c5c0c938 Mon Sep 17 00:00:00 2001 From: randymay Date: Fri, 3 Nov 2017 16:22:22 -0400 Subject: [PATCH] HHH-12225 - NullPointerException When Using type() in HQL --- .../tuple/entity/PojoEntityTuplizer.java | 4 + .../hibernate/query/hhh12225/Contract.java | 380 ++++++++++++++++++ .../hibernate/query/hhh12225/HQLTypeTest.java | 77 ++++ .../org/hibernate/query/hhh12225/Vehicle.java | 285 +++++++++++++ .../query/hhh12225/VehicleContract.java | 39 ++ .../query/hhh12225/VehicleTrackContract.java | 30 ++ .../hibernate/query/hhh12225/Contract.hbm.xml | 46 +++ .../hibernate/query/hhh12225/Vehicle.hbm.xml | 31 ++ 8 files changed, 892 insertions(+) create mode 100644 hibernate-core/src/test/java/org/hibernate/query/hhh12225/Contract.java create mode 100644 hibernate-core/src/test/java/org/hibernate/query/hhh12225/HQLTypeTest.java create mode 100644 hibernate-core/src/test/java/org/hibernate/query/hhh12225/Vehicle.java create mode 100644 hibernate-core/src/test/java/org/hibernate/query/hhh12225/VehicleContract.java create mode 100644 hibernate-core/src/test/java/org/hibernate/query/hhh12225/VehicleTrackContract.java create mode 100644 hibernate-core/src/test/resources/org/hibernate/query/hhh12225/Contract.hbm.xml create mode 100644 hibernate-core/src/test/resources/org/hibernate/query/hhh12225/Vehicle.hbm.xml diff --git a/hibernate-core/src/main/java/org/hibernate/tuple/entity/PojoEntityTuplizer.java b/hibernate-core/src/main/java/org/hibernate/tuple/entity/PojoEntityTuplizer.java index 775bd4c3e1..f186e8a384 100644 --- a/hibernate-core/src/main/java/org/hibernate/tuple/entity/PojoEntityTuplizer.java +++ b/hibernate-core/src/main/java/org/hibernate/tuple/entity/PojoEntityTuplizer.java @@ -300,6 +300,10 @@ public class PojoEntityTuplizer extends AbstractEntityTuplizer { @Override public String determineConcreteSubclassEntityName(Object entityInstance, SessionFactoryImplementor factory) { + if ( entityInstance == null ) { + return getEntityName(); + } + final Class concreteEntityClass = entityInstance.getClass(); if ( concreteEntityClass == getMappedClass() ) { return getEntityName(); diff --git a/hibernate-core/src/test/java/org/hibernate/query/hhh12225/Contract.java b/hibernate-core/src/test/java/org/hibernate/query/hhh12225/Contract.java new file mode 100644 index 0000000000..d6946861ef --- /dev/null +++ b/hibernate-core/src/test/java/org/hibernate/query/hhh12225/Contract.java @@ -0,0 +1,380 @@ +/* + * Hibernate, Relational Persistence for Idiomatic Java + * + * License: GNU Lesser General Public License (LGPL), version 2.1 or later. + * See the lgpl.txt file in the root directory or . + */ +package org.hibernate.query.hhh12225; + +import java.util.Date; + +public class Contract { + public static final long serialVersionUID = 1L; + + private transient boolean overrideEnabled = false; + + private Long id; + private Date creationDate; + private Date modifiedDate; + private Integer version; + + private boolean rendered; + private boolean fixedPrice; + private boolean renewable; + private boolean emailDistributionRequested; + + private Integer financedTerm; + private Integer financedAmortizationPeriod; + private Integer coverageTerm; + + private Long trackingId; + private Long timeToCreate = 0L; + private Long templateId; + + private Double productPrice = 0.0; + private Double totalCost = 0.0; + private Double paymentAmount = 0.0; + private Double price = 0.0; + private Double financedAmount = 0.0; + private Double coverageBenefit = 0.0; + private Double coveragePaymentRelief = 0.0; + private Double coverageFinanced = 0.0; + private Double previousDeficiency = 0.0; + private Double coverageDeficiency = 0.0; + private Double interestRate = 0.0; + + private String externalId; + private String paymentMethod; + private String paymentFrequency; + private String accountNumber; + private String origin; + private String premiumFinanced; + private String locale; + + private Date effectiveDate; + private Date terminationDate; + private Date renewalDate; + private Date expiryDate; + + private Contract _endorsed; + + public Contract() { + } + + public boolean isNew() { + return this.id == null; + } + + public Long getId() { + return this.id; + } + + public void setId(Long id) { + this.id = id; + } + + public Date getEffectiveDate() { + return this.effectiveDate; + } + + public void setEffectiveDate(Date effectiveDate) { + this.effectiveDate = effectiveDate; + } + + public Date getTerminationDate() { + return this.terminationDate; + } + + public void setTerminationDate(Date terminationDate) { + this.terminationDate = terminationDate; + } + + public String getExternalId() { + return this.externalId; + } + + public void setExternalId(String externalId) { + this.externalId = externalId; + } + + public Long getTemplateId() { + return this.templateId; + } + + public void setTemplateId(Long templateId) { + this.templateId = templateId; + } + + public Double getPrice() { + return this.price; + } + + public void setPrice(Double price) { + this.price = price; + } + + public Integer getVersion() { + return this.version; + } + + public void setVersion(Integer version) { + this.version = version; + } + + public String toString() { + return String.valueOf( id ); + } + + public Integer getFinancedTerm() { + return financedTerm; + } + + public void setFinancedTerm(Integer integer) { + financedTerm = integer; + } + + public Long getTrackingId() { + return trackingId; + } + + public void setTrackingId(Long id) { + trackingId = id; + } + + public Date getCreationDate() { + return creationDate; + } + + public Date getModifiedDate() { + return modifiedDate; + } + + public void setCreationDate(Date date) { + creationDate = date; + } + + public void setModifiedDate(Date date) { + modifiedDate = date; + } + + public Integer getCoverageTerm() { + return coverageTerm; + } + + public void setCoverageTerm(Integer integer) { + coverageTerm = integer; + } + + public String getAccountNumber() { + return accountNumber; + } + + public Double getFinancedAmount() { + return financedAmount; + } + + public void setAccountNumber(String string) { + accountNumber = string; + } + + public void setFinancedAmount(Double double1) { + financedAmount = double1; + } + + public Double getCoverageDeficiency() { + return coverageDeficiency; + } + + public Double getPreviousDeficiency() { + return previousDeficiency; + } + + public void setCoverageDeficiency(Double double1) { + coverageDeficiency = double1; + } + + public void setPreviousDeficiency(Double double1) { + previousDeficiency = double1; + } + + public Double getTotalCost() { + return totalCost; + } + + public void setTotalCost(Double double1) { + totalCost = double1; + } + + public Double getInterestRate() { + return interestRate; + } + + public void setInterestRate(Double double1) { + interestRate = double1; + } + + public boolean isRendered() { + return rendered; + } + + public void setRendered(boolean b) { + rendered = b; + } + + public Double getCoverageBenefit() { + return coverageBenefit; + } + + public Double getCoverageFinanced() { + return coverageFinanced; + } + + public void setCoverageBenefit(Double double1) { + coverageBenefit = double1; + } + + public void setCoverageFinanced(Double double1) { + coverageFinanced = double1; + } + + public boolean isFixedPrice() { + return fixedPrice; + } + + public void setFixedPrice(boolean fixedPrice) { + this.fixedPrice = fixedPrice; + } + + public Double getProductPrice() { + return productPrice; + } + + public void setProductPrice(Double productPrice) { + this.productPrice = productPrice; + } + + public Long getTimeToCreate() { + return timeToCreate; + } + + public void setTimeToCreate(Long timeToCreate) { + this.timeToCreate = timeToCreate; + } + + public String getPaymentMethod() { + return paymentMethod; + } + + public void setPaymentMethod(String paymentMethod) { + this.paymentMethod = paymentMethod; + } + + public String getPaymentFrequency() { + return paymentFrequency; + } + + public void setPaymentFrequency(String paymentFrequency) { + this.paymentFrequency = paymentFrequency; + } + + public Double getPaymentAmount() { + return paymentAmount; + } + + public void setPaymentAmount(Double paymentAmount) { + this.paymentAmount = paymentAmount; + } + + public Double getCoveragePaymentRelief() { + return coveragePaymentRelief; + } + + public void setCoveragePaymentRelief(Double coveragePaymentRelief) { + this.coveragePaymentRelief = coveragePaymentRelief; + } + + public Date getExpiryDate() { + return expiryDate; + } + + public void setExpiryDate(Date coverageTerminationDate) { + this.expiryDate = coverageTerminationDate; + } + + public String getPremiumFinanced() { + return premiumFinanced; + } + + public void setPremiumFinanced(String premiumFinanced) { + this.premiumFinanced = premiumFinanced; + } + + public Integer getFinancedAmortizationPeriod() { + return financedAmortizationPeriod; + } + + public void setFinancedAmortizationPeriod(Integer financedAmortizationPeriod) { + this.financedAmortizationPeriod = financedAmortizationPeriod; + } + + public Date getRenewalDate() { + return renewalDate; + } + + public void setRenewalDate(Date refinancingDate) { + this.renewalDate = refinancingDate; + } + + public boolean isRenewable() { + return renewable; + } + + public void setRenewable(boolean renewable) { + this.renewable = renewable; + } + + public boolean isEmailDistributionRequested() { + return emailDistributionRequested; + } + + public void setEmailDistributionRequested(boolean emailDistributionRequested) { + this.emailDistributionRequested = emailDistributionRequested; + } + + public String getOrigin() { + return origin; + } + + public void setOrigin(String origin) { + this.origin = origin; + } + + public Contract getEndorsed() { + return _endorsed; + } + + public void setEndorsed(Contract endorsed) { + _endorsed = endorsed; + } + + public boolean isEndorsement() { + return _endorsed != null; + } + + public String getLocale() { + return locale; + } + + public void setLocale(String locale) { + this.locale = locale; + } + + public boolean isOverrideEnabled() { + return overrideEnabled; + } + + public void setOverrideEnabled(boolean overrideEnabled) { + this.overrideEnabled = overrideEnabled; + } + +} diff --git a/hibernate-core/src/test/java/org/hibernate/query/hhh12225/HQLTypeTest.java b/hibernate-core/src/test/java/org/hibernate/query/hhh12225/HQLTypeTest.java new file mode 100644 index 0000000000..3a2c3e9546 --- /dev/null +++ b/hibernate-core/src/test/java/org/hibernate/query/hhh12225/HQLTypeTest.java @@ -0,0 +1,77 @@ +/* + * Hibernate, Relational Persistence for Idiomatic Java + * + * License: GNU Lesser General Public License (LGPL), version 2.1 or later. + * See the lgpl.txt file in the root directory or . + */ +package org.hibernate.query.hhh12225; + +import java.util.List; + +import org.hibernate.testing.TestForIssue; +import org.hibernate.testing.junit4.BaseCoreFunctionalTestCase; +import org.junit.Test; + +import static org.hibernate.testing.transaction.TransactionUtil.doInHibernate; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; + +@TestForIssue(jiraKey = "HHH-12225") +public class HQLTypeTest extends BaseCoreFunctionalTestCase { + + @Override + protected Class[] getAnnotatedClasses() { + return new Class[] { + }; + } + + @Override + protected String[] getMappings() { + return new String[] { + "Contract.hbm.xml", + "Vehicle.hbm.xml" + }; + } + + @Override + protected String getBaseForMappings() { + return "org/hibernate/query/hhh12225/"; + } + + @Test + public void test() throws Exception { + doInHibernate( this::sessionFactory, session -> { + for ( long i = 0; i < 10; i++ ) { + VehicleContract vehicleContract = new VehicleContract(); + Vehicle vehicle1 = new Vehicle(); + vehicle1.setContract( vehicleContract ); + VehicleTrackContract vehicleTrackContract = new VehicleTrackContract(); + Vehicle vehicle2 = new Vehicle(); + vehicle2.setContract( vehicleTrackContract ); + + session.save( vehicle1 ); + session.save( vehicle2 ); + session.save( vehicleContract ); + session.save( vehicleTrackContract ); + } + + List workingResults = session.createQuery( + "select rootAlias.id from Contract as rootAlias where rootAlias.id = :id" ) + .setParameter( "id", 1L ) + .getResultList(); + + assertFalse( workingResults.isEmpty() ); + Long workingId = (Long) workingResults.get( 0 ); + assertEquals( Long.valueOf( 1 ), workingId ); + + List failingResults = session.createQuery( + "select rootAlias.id, type(rootAlias) from Contract as rootAlias where rootAlias.id = :id" ) + .setParameter( "id", 1L ) + .getResultList(); + + assertFalse( failingResults.isEmpty() ); + Long failingId = (Long) ( (Object[]) failingResults.get( 0 ) )[0]; + assertEquals( Long.valueOf( 1 ), failingId ); + } ); + } +} diff --git a/hibernate-core/src/test/java/org/hibernate/query/hhh12225/Vehicle.java b/hibernate-core/src/test/java/org/hibernate/query/hhh12225/Vehicle.java new file mode 100644 index 0000000000..16bb6d28e0 --- /dev/null +++ b/hibernate-core/src/test/java/org/hibernate/query/hhh12225/Vehicle.java @@ -0,0 +1,285 @@ +/* + * Hibernate, Relational Persistence for Idiomatic Java + * + * License: GNU Lesser General Public License (LGPL), version 2.1 or later. + * See the lgpl.txt file in the root directory or . + */ +package org.hibernate.query.hhh12225; + +import java.util.Date; + +public class Vehicle { + public static final long serialVersionUID = 1L; + public static final String STATUS_NEW = "new"; + public static final String STATUS_USED = "used"; + + private Long _id; + private Integer _version; + private Date _creationDate; + private Date _modifiedDate; + + private String _vin; + private boolean _dirty; + private Double _msrp; + private Double _residualValue; + private Double _invoicePrice; + + private Integer _decodeAttempts; + private String _model; + private String _modelDetail; + private Integer _year; + private Integer _odometer; + private String _license; + private String _status; + private String _vehicleType; + private String _classification; + + private String _country; + private String _engineType; + private String _assemblyPlant; + private Integer _sequenceNumber; + private String _bodyType; + private String _fuelType; + private String _driveLineType; + + private VehicleContract _contract; + + /** + * default constructor + */ + public Vehicle() { + _decodeAttempts = 0; + } + + public Long getId() { + return _id; + } + + public void setId(Long id) { + _id = id; + } + + public Integer getVersion() { + return _version; + } + + public void setVersion(Integer version) { + _version = version; + } + + public Date getCreationDate() { + return _creationDate; + } + + public void setCreationDate(Date creationDate) { + _creationDate = creationDate; + } + + public Date getModifiedDate() { + return _modifiedDate; + } + + public void setModifiedDate(Date modifiedDate) { + _modifiedDate = modifiedDate; + } + + public String getVin() { + return _vin; + } + + public void setVin(String vin) { + _vin = vin; + } + + public boolean isDirty() { + return _dirty; + } + + public void setDirty(boolean dirty) { + _dirty = dirty; + } + + public Double getMsrp() { + return _msrp; + } + + public void setMsrp(Double msrp) { + _msrp = msrp; + } + + public Integer getDecodeAttempts() { + return _decodeAttempts; + } + + public void setDecodeAttempts(Integer decodeAttempts) { + _decodeAttempts = decodeAttempts; + } + + public String getModel() { + return _model; + } + + public void setModel(String model) { + _model = model; + } + + public String getModelDetail() { + return _modelDetail; + } + + public void setModelDetail(String modelDetail) { + _modelDetail = modelDetail; + } + + public Integer getYear() { + return _year; + } + + public void setYear(Integer year) { + _year = year; + } + + public Integer getOdometer() { + return _odometer; + } + + public void setOdometer(Integer odometer) { + _odometer = odometer; + } + + public String getLicense() { + return _license; + } + + public void setLicense(String license) { + _license = license; + } + + public String getStatus() { + return _status; + } + + public void setStatus(String status) { + _status = status; + } + + public String getVehicleType() { + return _vehicleType; + } + + public void setVehicleType(String vehicleType) { + _vehicleType = vehicleType; + } + + public String getCountry() { + return _country; + } + + public void setCountry(String country) { + _country = country; + } + + public String getEngineType() { + return _engineType; + } + + public void setEngineType(String engineType) { + _engineType = engineType; + } + + public String getAssemblyPlant() { + return _assemblyPlant; + } + + public void setAssemblyPlant(String assemblyPlant) { + _assemblyPlant = assemblyPlant; + } + + public Integer getSequenceNumber() { + return _sequenceNumber; + } + + public void setSequenceNumber(Integer sequenceNumber) { + _sequenceNumber = sequenceNumber; + } + + public String getBodyType() { + return _bodyType; + } + + public void setBodyType(String bodyType) { + _bodyType = bodyType; + } + + public String getFuelType() { + return _fuelType; + } + + public void setFuelType(String fuelType) { + _fuelType = fuelType; + } + + public String getDriveLineType() { + return _driveLineType; + } + + public void setDriveLineType(String driveLineType) { + _driveLineType = driveLineType; + } + + public VehicleContract getContract() { + return _contract; + } + + public void setContract(VehicleContract contract) { + _contract = contract; + } + + public String getClassification() { + return _classification; + } + + public void setClassification(String classification) { + _classification = classification; + } + + public Double getResidualValue() { + return _residualValue; + } + + public void setResidualValue(Double residualValue) { + _residualValue = residualValue; + } + + public Double getInvoicePrice() { + return _invoicePrice; + } + + public void setInvoicePrice(Double invoicePrice) { + _invoicePrice = invoicePrice; + } + + public String toString() { + return String.valueOf( _vin ); + } + + public boolean equals(Object obj) { + if ( obj == null ) { + return false; + } + if ( obj == this ) { + return true; + } + if ( obj instanceof Vehicle ) { + //TODO - needs to include contract equals comparision + return _vin.equals( ( (Vehicle) obj ).getVin() ); + } + return false; + } + + public int hashCode() { + return _vin.hashCode(); + } + + +} diff --git a/hibernate-core/src/test/java/org/hibernate/query/hhh12225/VehicleContract.java b/hibernate-core/src/test/java/org/hibernate/query/hhh12225/VehicleContract.java new file mode 100644 index 0000000000..f8891e4385 --- /dev/null +++ b/hibernate-core/src/test/java/org/hibernate/query/hhh12225/VehicleContract.java @@ -0,0 +1,39 @@ +/* + * Hibernate, Relational Persistence for Idiomatic Java + * + * License: GNU Lesser General Public License (LGPL), version 2.1 or later. + * See the lgpl.txt file in the root directory or . + */ +package org.hibernate.query.hhh12225; + +import java.util.ArrayList; +import java.util.List; + +public class VehicleContract extends Contract { + public static final long serialVersionUID = 1L; + + private List vehicles; + + public VehicleContract() { + vehicles = new ArrayList(); + } + + public void addVehicle(Vehicle vehicle) { + vehicle.setContract( this ); + getVehicles().add( vehicle ); + } + + public String toString() { + return String.valueOf( getId() ); + } + + public List getVehicles() { + return vehicles; + } + + public void setVehicles(List vehicles) { + this.vehicles = vehicles; + } + + +} diff --git a/hibernate-core/src/test/java/org/hibernate/query/hhh12225/VehicleTrackContract.java b/hibernate-core/src/test/java/org/hibernate/query/hhh12225/VehicleTrackContract.java new file mode 100644 index 0000000000..4fea201924 --- /dev/null +++ b/hibernate-core/src/test/java/org/hibernate/query/hhh12225/VehicleTrackContract.java @@ -0,0 +1,30 @@ +/* + * Hibernate, Relational Persistence for Idiomatic Java + * + * License: GNU Lesser General Public License (LGPL), version 2.1 or later. + * See the lgpl.txt file in the root directory or . + */ +package org.hibernate.query.hhh12225; + +public class VehicleTrackContract extends VehicleContract { + public static final long serialVersionUID = 1L; + private String _etchingId = null; + private boolean _original = false; + + public String getEtchingId() { + return _etchingId; + } + + public void setEtchingId(String etchingId) { + _etchingId = etchingId; + } + + public boolean isOriginal() { + return _original; + } + + public void setOriginal(boolean original) { + _original = original; + } + +} diff --git a/hibernate-core/src/test/resources/org/hibernate/query/hhh12225/Contract.hbm.xml b/hibernate-core/src/test/resources/org/hibernate/query/hhh12225/Contract.hbm.xml new file mode 100644 index 0000000000..1de330f940 --- /dev/null +++ b/hibernate-core/src/test/resources/org/hibernate/query/hhh12225/Contract.hbm.xml @@ -0,0 +1,46 @@ + + + + + + + + Walkaway Debt Cancellation Contract + + + + + + + + + + + + + + + + + + + + + + + + 1 + 1 + + + + + + + + + + + + diff --git a/hibernate-core/src/test/resources/org/hibernate/query/hhh12225/Vehicle.hbm.xml b/hibernate-core/src/test/resources/org/hibernate/query/hhh12225/Vehicle.hbm.xml new file mode 100644 index 0000000000..0ba5e09cde --- /dev/null +++ b/hibernate-core/src/test/resources/org/hibernate/query/hhh12225/Vehicle.hbm.xml @@ -0,0 +1,31 @@ + + + + + + + + Walkaway Vehicle Object + + + + + + + protected + + + + + + + + + + + + + + +