2017-08-21 4 views
0

を選択するようにcriteriabuilderを使用して、抽象クラスは、通常、私が使用してその派生クラスから必要な列のデータを取得私はテーブルの基本抽象クラスを持って安全なタイプを構築御馳走

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

すべての列を保持しません。 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") 
)) 

treatは、infoAとinfoB両方は、データベース内のMYTABLEに同じ列です。

私の質問は、一度の選択でinfoAとinfoBの両方を選択するための型セーフセレクトをどのように記述しますか?

答えて

0

InfoAとinfoBの両方の変数を基底クラスに移動しないという本当の理由がある場合は、OOの原則が示唆するように、すべてを簡素化するので、わかりません。

しかし、あなたは無意識にそれを作った場合、私が作ることをお勧めそのORMフレームワークが提供するすべての利点を持つ小さなリファクタリングと使用の継承マッピング:あなたのMyClassAとMyClassB照会することができるようになりますように

@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 { 
    //... 
} 

polymorphicly entites:休止状態の場合は

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(); 

、単に以下をチェックアウト:

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

+0

ありがとうございました。私は理由も知らない、それは私のコードではない。しかし、私はこのコードを使って作業しなければならないとしましょう。結果では、infoAとinfoBの両方を単一の列として選択するにはどうすればいいですか? – user1589188

関連する問題