如何将List <object []>设置为HQL参数?</object []>

时间:2013-02-26 13:43:59

标签: java hibernate hql

这是我想要执行的代码:

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();

以下是开始和结束参数的情况:

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中获得该效果?

2 个答案:

答案 0 :(得分:0)

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

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

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

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

答案 1 :(得分:0)

只需一次调用数据库,就无法完成所需的操作。如果你真的想只打一次数据库那么我觉得你最好的选择是:

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,男,5)(18,女,4)(19,男,3)(19,女,6)......

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