2017-08-21 75 views
0

我有一个表中的抽象基类,抽象类不把所有的列使用criteriabuilder构建类型安全的选择与治疗

@Entity 
@Table(name = "MYTABLE") 
public abstract class MyTable { 
    //... 
} 

通常我从它的派生类所需的列数据使用treat在criteriabuilder

@Entity 
public class MyClassA extends MyTable { 
    //... 
} 
@Entity 
public class MyClassB extends MyTable { 
    //... 
} 

Root<MyTable> myTable = cq.from(MyTable.class); 
cq.where(cb.or(
    cb.equal(cb.treat(myTable, MyClassA.class).get(MyClassA_.infoA), "A"), 
    cb.equal(cb.treat(myTable, MyClassB.class).get(MyClassB_.infoB), "B") 
)) 

这里INFOA和infoB都是在数据库中MYTABLE同一列。

我的问题是你如何写一个类型安全的选择来选择单个选择中的infoA和infoB?

回答

0

我不确定,如果有一个真正的原因,不要将两个infoA和infoB变量移动到您的基类中,就像面向对象的原则所建议的那样,因为它简化了一切。

但是如果你无意中做的话,我会建议做小重构和使用继承映射与ORM框架提供的所有好处:

@Entity 
public abstract class MyTable { 

    @javax.persistence.Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    private Long Id; 

    private String info; 

    public String getInfo() { 
     return info; 
    } 

    public void setInfo(String info) { 
     this.info = info; 
    } 

    public Long getId() { 
     return Id; 
    } 

    public void setId(Long id) { 
     Id = id; 
    } 
} 

@Entity 
public class MyClassA extends MyTable { 
    //... 
} 
@Entity 
public class MyClassB extends MyTable { 
    //... 
} 

这样你就可以查询您的MyClassA和MyClassB entites的polymorphicly:

CriteriaBuilder builder = entityManager.getCriteriaBuilder(); 
     CriteriaQuery<MyTable> query = builder.createQuery(MyTable.class); 
     Root<MyTable> root = query.from(MyTable.class); 
     query.select(root); 
     List<MyTable> entities = entityManager.createQuery(query).getResultList(); 

在Hibernate中的情况下,只检查了以下工作:

http://docs.jboss.org/hibernate/orm/5.2/userguide/html_single/Hibernate_User_Guide.html#entity-inheritance

+0

谢谢。我也不知道原因,那不是我的代码。但让我说我必须使用这段代码,我怎样才能在结果中选择infoA和infoB作为单个列? – user1589188