2016-09-14 307 views
0

我在MySql上使用JPA2/Hibernate5和Java8。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行:

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; 
} 

时对数据库运行下面的SQL语句,返回3行:

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; 
}