/* * 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 <http://www.gnu.org/licenses/lgpl-2.1.html>. */ package org.hibernate.jpa.test.criteria.mapjoin; import java.io.Serializable; import java.util.HashMap; import java.util.Map; import javax.persistence.CollectionTable; import javax.persistence.Column; import javax.persistence.ElementCollection; import javax.persistence.Embeddable; import javax.persistence.Entity; import javax.persistence.EnumType; import javax.persistence.Enumerated; import javax.persistence.GeneratedValue; import javax.persistence.Id; import javax.persistence.JoinColumn; import javax.persistence.MapKeyJoinColumn; import javax.persistence.SequenceGenerator; import javax.persistence.Table; 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.BaseEntityManagerFunctionalTestCase; import org.hibernate.testing.TestForIssue; import org.junit.Test; import static org.hibernate.testing.transaction.TransactionUtil.doInJPA; /** * @author Christian Beikov */ public class MapJoinTestWithEmbeddable extends BaseEntityManagerFunctionalTestCase { @Override protected Class<?>[] getAnnotatedClasses() { return new Class[] {Batch.class, Node.class, BatchNodeMetadata.class}; } @Test @TestForIssue( jiraKey = "HHH-10455" ) public void testSelectingKeyOfMapJoin() { doInJPA( this::entityManagerFactory, entityManager -> { CriteriaBuilder cb = entityManager.getCriteriaBuilder(); CriteriaQuery<Node> query = cb.createQuery( Node.class ); Root<Batch> root = query.from( Batch.class ); MapJoin nodes = (MapJoin) root.join( "batchNodeMetadata" ); query.select( nodes.key() ); query.where( cb.equal( root.get( "id" ), 1 ) ); entityManager.createQuery( query ).getResultList(); } ); } @Test @TestForIssue( jiraKey = "HHH-10229" ) public void testSelectingValueOfMapJoin() { doInJPA( this::entityManagerFactory, entityManager -> { CriteriaBuilder cb = entityManager.getCriteriaBuilder(); CriteriaQuery<Node> query = cb.createQuery( Node.class ); Root<Batch> root = query.from( Batch.class ); MapJoin nodes = (MapJoin) root.join( "batchNodeMetadata" ); query.select( nodes ); query.where( cb.equal( root.get( "id" ), 1 ) ); entityManager.createQuery( query ).getResultList(); } ); } @Entity @Table(name = "batch") public static class Batch implements Serializable { @Id @GeneratedValue(generator = "BatchGen") @SequenceGenerator(name = "BatchGen", sequenceName = "seq_batch", allocationSize = 1) private Long id; @ElementCollection @CollectionTable( name = "batch_node", //uniqueConstraints = @UniqueConstraint(columnNames = {"batch_id", "node_id"}), //foreignKey = @ForeignKey, joinColumns = @JoinColumn(name = "batch_id", nullable = false)) @MapKeyJoinColumn(name = "node_id") private Map<Node, BatchNodeMetadata> batchNodeMetadata = new HashMap<>(); } @Entity @Table(name = "node") public static class Node implements Serializable { @Id @GeneratedValue(generator = "NodeGen") @SequenceGenerator(name = "NodeGen", sequenceName = "seq_node", allocationSize = 1) private Long id; } @Embeddable public static class BatchNodeMetadata implements Serializable { @Column(nullable = false) @Enumerated(EnumType.STRING) private NodeMigration migrering = NodeMigration.TOTAL; public NodeMigration getMigrering() { return migrering; } public void setMigrering(NodeMigration migrering) { this.migrering = migrering; } } public static enum NodeMigration { TOTAL } }