HHH-8885 MapJoin.key() produces unusable Path object
This commit is contained in:
parent
4ea068f2e9
commit
1fc74feada
|
@ -36,8 +36,10 @@ import javax.persistence.metamodel.MapAttribute;
|
|||
import javax.persistence.metamodel.SingularAttribute;
|
||||
import javax.persistence.metamodel.Type;
|
||||
|
||||
import org.hibernate.jpa.criteria.compile.RenderingContext;
|
||||
import org.hibernate.engine.spi.SessionFactoryImplementor;
|
||||
import org.hibernate.jpa.criteria.CriteriaBuilderImpl;
|
||||
import org.hibernate.jpa.criteria.PathSource;
|
||||
import org.hibernate.jpa.criteria.MapJoinImplementor;
|
||||
import org.hibernate.jpa.criteria.PathImplementor;
|
||||
import org.hibernate.persister.collection.CollectionPersister;
|
||||
|
@ -109,6 +111,20 @@ public class MapKeyHelpers {
|
|||
// todo : if key is an entity, this is probably not enough
|
||||
return (MapKeyPath<T>) this;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String render(RenderingContext renderingContext) {
|
||||
PathSource<?> source = getPathSource();
|
||||
String name;
|
||||
if ( source != null ) {
|
||||
source.prepareAlias( renderingContext );
|
||||
name = source.getPathIdentifier();
|
||||
}
|
||||
else {
|
||||
name = getAttribute().getName();
|
||||
}
|
||||
return "key(" + name + ")";
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -164,6 +180,12 @@ public class MapKeyHelpers {
|
|||
public <T extends Map<K, V>> PathImplementor<T> treatAs(Class<T> treatAsType) {
|
||||
throw new UnsupportedOperationException();
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getPathIdentifier() {
|
||||
return mapJoin.getPathIdentifier();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
@ -0,0 +1,45 @@
|
|||
package org.hibernate.jpa.test.criteria.mapjoin;
|
||||
|
||||
import javax.persistence.EntityManager;
|
||||
import javax.persistence.criteria.CriteriaBuilder;
|
||||
import javax.persistence.criteria.CriteriaQuery;
|
||||
import javax.persistence.criteria.MapJoin;
|
||||
import javax.persistence.criteria.Root;
|
||||
|
||||
import org.hibernate.jpa.test.metamodel.AbstractMetamodelSpecificTest;
|
||||
import org.hibernate.jpa.test.metamodel.MapEntity;
|
||||
import org.hibernate.jpa.test.metamodel.MapEntityLocal;
|
||||
import org.hibernate.jpa.test.metamodel.MapEntityLocal_;
|
||||
import org.hibernate.jpa.test.metamodel.MapEntity_;
|
||||
import org.junit.Test;
|
||||
|
||||
public class MapJoinTest extends AbstractMetamodelSpecificTest {
|
||||
|
||||
@Override
|
||||
public Class[] getAnnotatedClasses() {
|
||||
return new Class[] { MapEntity.class, MapEntityLocal.class };
|
||||
}
|
||||
@Test
|
||||
public void allEntities() {
|
||||
EntityManager em = getOrCreateEntityManager();
|
||||
em.getTransaction().begin();
|
||||
|
||||
CriteriaBuilder cb = em.getCriteriaBuilder();
|
||||
CriteriaQuery<MapEntity> query = cb.createQuery(MapEntity.class);
|
||||
|
||||
Root<MapEntity> entity = query.from(MapEntity.class);
|
||||
MapJoin<MapEntity, String, MapEntityLocal> cname = entity.join(MapEntity_.localized);
|
||||
|
||||
query = query
|
||||
.select(entity)
|
||||
.where(
|
||||
cb.equal( cname.key(), "en" )
|
||||
)
|
||||
.orderBy( cb.asc( cb.upper( cname.value().get(MapEntityLocal_.shortName) ) ) );
|
||||
|
||||
em.createQuery(query).getResultList();
|
||||
|
||||
em.getTransaction().commit();
|
||||
em.close();
|
||||
}
|
||||
}
|
|
@ -0,0 +1,35 @@
|
|||
package org.hibernate.jpa.test.metamodel;
|
||||
|
||||
import java.util.Map;
|
||||
|
||||
import javax.persistence.CollectionTable;
|
||||
import javax.persistence.Column;
|
||||
import javax.persistence.ElementCollection;
|
||||
import javax.persistence.Entity;
|
||||
import javax.persistence.FetchType;
|
||||
import javax.persistence.Id;
|
||||
import javax.persistence.JoinColumn;
|
||||
import javax.persistence.MapKeyColumn;
|
||||
import javax.persistence.Table;
|
||||
|
||||
@Entity
|
||||
@Table( name = "MAP_ENTITY" )
|
||||
public class MapEntity {
|
||||
|
||||
@Id
|
||||
@Column(name="key_")
|
||||
private String key;
|
||||
|
||||
@ElementCollection(fetch=FetchType.LAZY)
|
||||
@CollectionTable(name="MAP_ENTITY_NAME", joinColumns=@JoinColumn(name="key_"))
|
||||
@MapKeyColumn(name="lang_")
|
||||
private Map<String, MapEntityLocal> localized;
|
||||
|
||||
public String getKey() {
|
||||
return key;
|
||||
}
|
||||
|
||||
public void setKey(String key) {
|
||||
this.key = key;
|
||||
}
|
||||
}
|
|
@ -0,0 +1,19 @@
|
|||
package org.hibernate.jpa.test.metamodel;
|
||||
|
||||
import javax.persistence.Column;
|
||||
import javax.persistence.Embeddable;
|
||||
|
||||
@Embeddable
|
||||
public class MapEntityLocal {
|
||||
|
||||
@Column(name="short_name")
|
||||
private String shortName;
|
||||
|
||||
public String getShortName() {
|
||||
return shortName;
|
||||
}
|
||||
|
||||
public void setShortName(String shortName) {
|
||||
this.shortName = shortName;
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue