2017-01-18 3 views
0

私はJPA CriteriaBuilderのマップされていないテーブルを参照できますか?

public abstract class HibernateEntitySelector<T> extends HibernateDAOSupport implements EntitySelector<T> { 
    @Autowired 
    public void init(SessionFactory factory) { 
     setSessionFactory(factory); 
    } 
    public String SELECT_IDS = " IN (SELECT RESULT_ID FROM QUERY_RESULTS)"; 

    public List<T> getEntitiesByIds(){ 
     DetachedCriteria criteria = DetachedCriteria.forClass(getEntityClass()); 
     criteria.add(Restrictions.sqlRestriction(getPrimaryKeyField()+SELECT_IDS)); 
     return (List<T>) this.getHibernateTemplate().findByCriteria(criteria); 
    } 

..エンティティマネージャを使用して、次のクエリを記述し直すためにこのような何か...

public abstract class HibernateEntitySelector<T> implements EntitySelector<T> { 

public String SELECT_IDS = " IN (SELECT RESULT_ID FROM QUERY_RESULTS)"; 

    @PersistenceContext 
    protected EntityManager em; 

    public List<T> getEntitiesByIds(){ 
     String s = "FROM " + getEntityClass().getSimpleName() + " ent WHERE ent."+getEntityId()+SELECT_IDS; 
     Query query = this.em.createNamedQuery(s); 
     return (List<T>)query.getResultList(); 
    } 
} 

をしようとしています。しかし、これは原因QUERY_RESULTSマップされていないために失敗しました。 createNativeQueryメソッドを使用せずにすべての列を手動でマップする必要がない方法はありますか?

答えて

1

使用しているのにあなたは、かなり接近していた:

Query query = this.em.createNamedQuery(s); 

を代わりにcreateNativeQueryを使用しても一緒にクエリ文字列を変更:

String s = "SELECT ent.* FROM " + getEntityClass().getSimpleName() + " ent WHERE ent."+getEntityId() + SELECT_IDS; 
Query query = this.em.createNativeQuery(s, getEntityClass()); 

はそれを試してみてください。

+0

これはうまくいきました。私はこれを受け入れられた解決策としてマークする方法を知らない。 :) OKそれを見つけた。 doh – user2554194

+0

素晴らしい!それがうれしかった –

関連する問題