2017-08-21 30 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