package com.querydsl.apt.domain; import static org.junit.Assert.assertNotNull; import java.io.Serializable; import java.util.HashSet; import java.util.Set; import javax.persistence.*; import org.hibernate.proxy.HibernateProxy; import org.junit.Test; import com.querydsl.core.annotations.PropertyType; import com.querydsl.core.annotations.QueryInit; import com.querydsl.core.annotations.QueryType; public class QueryInit6Test { @Entity(name = Component.NAME) @Inheritance(strategy = InheritanceType.TABLE_PER_CLASS) public abstract static class Component implements Serializable { public static final String NAME = "Component"; @Id protected String id; @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "parent_id") private Component parent; @QueryType(PropertyType.ENTITY) @QueryInit("*") @Transient public Container getContainer() { Component temp = this.parent; if (this.parent instanceof HibernateProxy) { temp = (Component) ((HibernateProxy) this.parent) .getHibernateLazyInitializer().getImplementation(); } if (temp instanceof Container) { return (Container) temp; } else { if (!temp.isRoot()) { return temp.getParent().getContainer(); } else { return null; } } } @OneToMany(mappedBy = "parent", cascade = CascadeType.ALL, fetch = FetchType.LAZY) private Set<Component> children; protected Component() { } protected Component(String id, Component parent) { this.id = id; this.parent = parent; this.children = new HashSet<Component>(); } @Transient public boolean isRoot() { return (parent == null); } public String getId() { return id; } public void setId(String id) { this.id = id; } public Set<Component> getChildren() { return children; } public void setChildren(Set<Component> children) { this.children = children; } public Component getParent() { return parent; } public void setParent(Component parent) { this.parent = parent; } } @Entity(name = Content.NAME) public static class Content extends Component { public static final String NAME = "Content"; @Column(name = "quantity") private long quantity; public Content() { super(null, null); } public Content(String id, Component parent) { super(id, parent); this.quantity = 0; } @Override public String toString() { return "Content [id=" + id + " qty=" + quantity + "]"; } public long getQuantity() { return quantity; } public void setQuantity(long quantity) { this.quantity = quantity; } } @Entity(name = Container.NAME) public static class Container extends Component { public static final String NAME = "Container"; @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "packaging_id") private Packaging packaging; public Container() { super(null, null); } public Container(String id, Component parent) { super(id, parent); this.packaging = null; } public Packaging getPackaging() { return packaging; } public void setPackaging(Packaging packaging) { this.packaging = packaging; } } @Entity(name = Packaging.NAME) public static class Packaging implements Serializable { public static final String NAME = "Packaging"; @Id private String id; @Column(name = "description") private String description; public Packaging() { } public Packaging(String id, String description) { this.id = id; this.description = description; } public String getId() { return id; } public void setId(String id) { this.id = id; } public String getDescription() { return description; } public void setDescription(String description) { this.description = description; } } @Test public void test() { assertNotNull(QQueryInit6Test_Content.content.container.packaging); assertNotNull(QQueryInit6Test_Content.content.container.packaging.id); } }