2016-09-14 7 views
0

私はJPA2/Hibernate5とJava8 over MySqlを使用しています。私は、同じパラメータを使用してデータベースに対して直接実行するとき1行を返すJPA/Hibernateクエリ

Query q = entityManager.createNativeQuery(sb.toString(), JobWithDistance.class); 
q.setParameter("ids", ids); 
List<JobWithDistance> jobsWD = (List<JobWithDistance>) q.getResultList(); 

SQL sbで戻っ3行

は、私は、次のネイティブクエリを実行します。しかし、Hibernate経由でネイティブクエリを実行すると、の1行がにしかなりません。

結果が異なるのはなぜですか?

詳細情報:、データベースに対して実行次のSQL

StringBuilder sb = getFindQuery(); 
    sb.append(" where e.id in (:ids) "); 
    Query q = entityManager.createNativeQuery(sb.toString(), JobWithDistance.class); 
    q.setParameter("ids", ids); 
    //Object o = q.getResultList(); 
    List<JobWithDistance> jobsWD = q.getResultList(); 

private StringBuilder getFindQuery() { 
    StringBuilder sb = new StringBuilder(); 
    sb.append(" select * "); 
    sb.append(" , -1 as noReviews, -1 as averageRating "); 
    sb.append(" , -1 AS distance "); 
    sb.append(" from "); 
    sb.append(" www.job as e "); 
    sb.append(" inner join www.person_job as pj on e.id = pj.JOB_ID "); 
    sb.append(" inner join www.person as p on pj.PER_ID = p.id "); 
    sb.append(" left join www.rating_job rp ON e.id = rp.JOB_ID "); 
    sb.append(" left join www.rating r ON rp.RAT_ID = r.id "); 
    return sb; 
} 

3行を返す:

Hibernateは1行を返す

select * , -1 as noReviews, -1 as averageRating , -1 AS distance from  www.job as e inner join www.person_job as pj on e.id = pj.JOB_ID inner join www.person as p on pj.PER_ID = p.id left join www.rating_job rp ON e.id = rp.JOB_ID left join www.rating r ON rp.RAT_ID = r.id where e.id in (65, 66, 64) 

おかげ

答えて

0

SOLUTION:

@Override 
public List<Job> findById(String ids) { 

    String[] args = ids.split(","); 
    Set<String> idSet = new HashSet<String>(Arrays.asList(args)); 

    CriteriaBuilder builder = entityManager.getCriteriaBuilder(); 
    CriteriaQuery<Job> query = builder.createQuery(Job.class); 
    Root<Job> post = query.from(Job.class); 
    query.select(post).where(post.get("id").in(idSet)); // or pass a tag collection to `in` method 
    TypedQuery<Job> typedQuery = entityManager.createQuery(query); 
    List<Job> results = typedQuery.getResultList(); 
    return results; 
}