【问题标题】:JPA/Hibernate query only returning one rowJPA/Hibernate 查询只返回一行
【发布时间】:2016-09-14 19:08:22
【问题描述】:

我在 MySql 上使用 JPA2/Hibernate5 和 Java8。

我运行以下本机查询:

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

sb 中的 sql 在我使用相同参数直接针对数据库运行时返回 3 行。但是,当我通过 Hibernate 运行本机查询时,我只得到 一行

为什么结果不同?

更多信息:

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) 

谢谢

【问题讨论】:

    标签: mysql sql hibernate jpa


    【解决方案1】:

    解决方案:

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

    【讨论】:

    • 解决方案: 不是有效的答案格式。请详细说明
    猜你喜欢
    • 2021-02-01
    • 2012-11-19
    • 1970-01-01
    • 2010-11-03
    • 2020-06-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多