【问题标题】:How to set List<Object[]> to HQL parameter?如何将 List<Object[]> 设置为 HQL 参数?
【发布时间】:2013-02-26 13:43:59
【问题描述】:

这是我要执行的代码:

Query query = getSession().createQuery("select count(*),uv.voter.gender from UserVoter uv  where " +
            "  uv.voter.age between "+startAge+" and "+endAge+" and uv.hamlet.hamletId = :hamletId  group by uv .voter.gender  ") ;
    //query.setParameter("publicationDateId",publicationDateId);
    query.setParameter("hamletId", hamletId);
      return query.list();

start和end参数的情况如下:

18-25
25-35
35-45 

对于这 3 种情况,我必须运行 3 次查询。对于上述三种情况,我想在一次查询中获得结果。我对new map() 有一个想法,但我该怎么做呢?

输出应该映射到一对输入参数,例如:

18-25,55,male 18-25,56,female 25-35,44,male..

在mysql中我实现了这个

select concat(18,'to',25),count( v.voter_id),v.gender from voter v join  user_voter u on v.voter_id = u.voter_id
where v.age between 18 and 25 and u.hamlet_id=10 group by v.gender
union
select concat(26,'to',35),count( v.voter_id),v.gender from voter v join  user_voter u on v.voter_id = u.voter_id
where v.age between 26 and 35 and u.hamlet_id=10 group by v.gender
union
select concat(36,'to',50),count( v.voter_id),v.gender from voter v join  user_voter u on v.voter_id = u.voter_id
where v.age between 36 and 50 and u.hamlet_id=10 group by v.gender
union
select concat(51,'to',200),count( v.voter_id),v.gender from voter v join  user_voter u on v.voter_id = u.voter_id
where v.age between 51 and 200 and u.hamlet_id=10 group by v.gender;

但是如何在不使用原生 sql 的情况下在 hibernate 中获得这种效果?

【问题讨论】:

    标签: java hibernate hql


    【解决方案1】:

    首先,您还应该为 startAge 和 endAge 使用参数。

    然后您可以在您的字符串中生成所需的其他条件,用于在您的案例上使用 for 循环进行查询,这将为您提供类似:

    (uv.voter.age between :startAge0 and :endAge0) or (uv.voter.age between :startAge1 and :endAge1) ... 
    

    您可以轻松生成以下字符串,然后使用 namedParameters 添加参数。 如果您不喜欢这种情况下的定位参数(使用“?”,然后使用索引设置参数),您可以查看一下。

    【讨论】:

    • for 循环也运行时间并与数据库交互 3 次
    • 您不执行查询,而是使用for循环构造具有3个条件的字符串查询。
    • 我想要这样的地图输出
    【解决方案2】:

    你不能通过一次调用数据库来做你想做的事。如果您真的只想访问数据库一次,那么我认为您最好的选择是:

    select uv.voter.age, uv.voter.gender, count(*) from UserVoter uv where uv.hamlet.hamletId = :hamletId group by uv.voter.age, uv.voter.gender
    

    这会给你 (18,male,5) (18,female,4) (19,male,3) (19,female,6) ...

    然后您可以以编程方式对结果进行分组。

    【讨论】:

    • 我可以使用数据库过程或函数来实现吗
    猜你喜欢
    • 2023-03-08
    • 1970-01-01
    • 1970-01-01
    • 2020-11-27
    • 1970-01-01
    • 2017-04-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多