2017-11-21 15 views
2

私はJPA Criteria APIを使用しています。私のクエリの複数選択では、enum属性ではなくenum属性を取得したいと考えています。列挙型フィールドを持つエンティティでJPA CriteriaQueryを使用してDTOクラス文字列フィールドを設定するにはどうすればよいですか?

これは私のクエリです:

MyClassDTO
final CriteriaQuery<MyClassDTO> query = builder.createQuery(MyClassDTO.class); 

私は次のように4つのフィールドがあります。

private String icon; 
private String provenance; 
private int sizeX; 
private int sizeY; 

を私はからデータを取得していますパスは次のとおりです。

final Root<MyClass> from = query.from(MyClass.class); 

MyClassには3つのフィールドがあります:

01どのように私はこの問題を解決することができます

query.multiselect(
    from.get(MyClass_.enumTileIcon.toString()), 
    from.get(MyClass_.enumProvenance.name()), 
    from.get(MyClass_.enumSize.getWidth()), 
    from.get(MyClass_.enumSize.getHeight()) 
); 

:私は何をしたいか

@Column 
@Enumerated(EnumType.STRING) 
private EnumTileIcon enumTileIcon; 

@Column 
@Enumerated(EnumType.STRING) 
private EnumProvenance enumProvenance; 

@Column 
@Enumerated(EnumType.STRING) 
private EnumSize enumSize; 

は、query.multiselectを使用して、このような何かをMyClassDTOを移入するのですか?

+0

私はこれに対してタプルクエリーを使用する必要があると思います。 – Antoniossss

+0

@Antoniossssどうすればいいですか? –

+0

builder.createQuery(Tuple.class); – Antoniossss

答えて

3

マルチセレクションの役割についてはわかりません。しかし、これはあなたがのparamsが一致するAdd(のようなクエリでは、コンストラクタを呼び出します(必要に応じてのparamsを追加)のようMyClassDTO

public MyClassDTO(EnumTileIcon icon, EnumProvenance provenance) { 
    this.icon=icon.toString(); 
    this.provenance=provenance.toString(); 
} 

をコンストラクタを作成CriteriaBuilder.construct()

を使用することができるように思われるもの投影を扱うとき必要に応じて、コンストラクタのparams)

CriteriaBuilder cb = em.getCriteriaBuilder(); 
CriteriaQuery<MyClassDTO> cq = cb.createQuery(MyClassDTO.class); 
Root<MyClass> root = cq.from(MyClass.class); 
cq.select(cb.construct(MyClassDTO.class, 
      root.get("enumTileIcon"), root.get("enumProvenance"))); 

は、次に、あなたが得ることができるようになります

TypedQuery<MyClassDTO> tq = em.createQuery(cq); 
関連する問題