2014-06-20 30 views
1

我有问题,我有一个抽象基实体火车站。继承TABLE_PER_CLASS和三个子表StationCompany StationAnalysis StationVariantHibernate的JPA @Inheritance TABLE_PER_CLASS JpaRepository在儿童实体联合选择所有表

@MappedSuperclass 
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS) 
public abstract class Station { 

@Entity 
public class StationCompany extends Station { 

@ManyToOne(optional = false, fetch = FetchType.EAGER) 
@Fetch(FetchMode.SELECT) 
private Company company; 

@Entity 
public class StationAnalysis extends StationCompany { 

@ManyToOne(optional = false, fetch = FetchType.EAGER) 
@Fetch(FetchMode.SELECT) 
private Analysis analysis; 

@Entity 
public class StationVariant extends StationAnalysis { 

@ManyToOne(optional = false, fetch = FetchType.EAGER) 
@Fetch(FetchMode.SELECT) 
private Variant variant; 

public interface IStationCompanyRepository extends JpaRepository<StationCompany, Long> { 

@Service 
public class StationService implements IStationService<StationCompany> { 

    @Autowired 
    IStationCompanyRepository stationCompanyRepository; 

然后我搜索的findAll上StationCompany ,hibernate使用union select进行查询。 我将只搜索StationCompany委托人。

select x from (select a from StationCompany union select b from StationVariant union select c from StationAnalysis) 
+1

但是StationAnalysis是StationCompany,不能责怪冬眠,对吗? – maress

+0

我需要这个。站点分析有一个@ManyToOne公司+分析和站变体公司+分析+变体实体 – Monito

+0

请详细说明你想要的 – maress

回答

1

问题是Hibernate映射。我认为从Station到StationCompany到Station的结构有问题... 我使用aditional Abstract @MappedSuperclass类来解决问题。 之后,休眠选择正确的表,并没有更多的联合选择。

@MappedSuperclass 
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS) 
public abstract class Station { 

@MappedSuperclass 
public abstract class AbstractStationCompany extends Station { 
    @ManyToOne(optional = false, fetch = FetchType.EAGER) 
    @Fetch(FetchMode.SELECT) 
    private Company company; 

@Entity 
public class StationCompany extends AbstractStationCompany { 

@MappedSuperclass 
public class AbstractStationAnalysis extends AbstractStationCompany { 
    @ManyToOne(optional = false, fetch = FetchType.EAGER) 
    @Fetch(FetchMode.SELECT) 
    private Analysis analysis; 

@Entity 
public class StationAnalysis extends AbstractStationAnalysis { 

@Entity 
public class StationVariant extends AbstractStationAnalysis { 
0

不执行搜索所有。在你的站层次结构的主立面

@NamedQuery(name="Station.findStationByType", 
      query="SELECT s FROM Station s WHERE TYPE(s) = :type") 

然后:

上站创建一个NamedQuery

public class StationFacade<Station>{ 
    @PersistenceContext("contextName") 
    private EntityManager em; 

    public List<Station> findAll(Class<? extends Station> stationType){ 
    return em.createNamedQuery("Station.findStationByType") 
      .setParameter("type", stationType.getSimpleName()) 
      .getResultList(); 
    } 
} 
+0

sry你的解决方案有一个错误,@NamedQuery不知道TYPE(s)。 我找到了解决方案与 @NamedQuery执行命名查询后(NAME =“StationCompany.findAll”,查询=“选择■从StationCompany S”) 这个查询也使工会的选择。在下一篇文章是答案(我不能发布答案) – Monito

+0

问题是hibernate映射。我认为从Station到StationCompany到Station的结构有问题... 我使用aditional Abstract @MappedSuperclass类来解决问题。 (AT)MappedSuperclass (AT)继承(策略= InheritanceType.TABLE_PER_CLASS) 公共抽象类站{ (AT)MappedSuperclass 公共抽象类AbstractStationCompany延伸站{ (AT)多对一(可选=假,取= FetchType.EAGER) (at)Fetch(FetchMode.SELECT) 私人公司公司; – Monito

+0

(在)实体 公共类StationCompany延伸AbstractStationCompany { (AT)MappedSuperclass 公共类AbstractStationAnalysis延伸AbstractStationCompany { (AT)多对一(可选=假,取= FetchType.EAGER) (AT)获取(FetchMode。SELECT) 私人分析分析; (在)实体 公共类StationAnalysis延伸AbstractStationAnalysis { (在)实体 公共类StationVariant延伸AbstractStationAnalysis { – Monito