我在DaoImplementation中使用SQL查询(因为我无法使用HQL或Criteria来找到如何解决它)。
我有一个List对象,我需要将List的元素用作SQL中的IN子句,但我不知道该怎么做…
这是我的DAO实现中的方法
public List<Illuminazione> showLightsSituationsByUser(List<Park> parks) {
Query pianiQuery = getSession().createQuery("from Piano p where p.park = :parks");
pianiQuery.setParameterList("parks", parks);
List <Piano> piani = pianiQuery.list();
Query luciQuery = getSession().createQuery("from Luce l where l.piano in :piani");
luciQuery.setParameterList("piani", piani);
List<Luce> luci = luciQuery.list();
String query = "select i.id_evento, i.id_luce, i.last_date_time, l.numero_luce, l.nome_luce, ill.MaxDate, i.isLit ";
query += "from illuminazione i inner join luci l on i.id_luce= l.id_luce and l.id_piano in "+luci+" ";
query += "inner join (SELECT `id_luce` as numeroLuce2, max(date_time) as MaxDate from illuminazione i2 group by `i2`.`id_luce`) ill ";
query += "on i.id_luce = ill.`numeroLuce2` and i.`date_time` = ill.MaxDate order by i.`id_luce` asc";
SQLQuery q = getSession().createSQLQuery(query);
q.setResultTransformer(Criteria.ALIAS_TO_ENTITY_MAP);
List<Illuminazione> lista = q.list();
return lista;
}
从前两个查询中,我得到了我需要的列表(luci),然后从最后一个查询中(我承认这有点难看),我必须通过从List-luci中获取结果来缩小结果。显然,我的luci表有一个id_piano字段。
我怎样才能得到我需要的东西?感谢
如果我理解这个问题,这样的东西应该会起作用:
StringBuilder sb = new StringBuilder();
sb.append("select i.id_evento ... l.id_piano in (");
for (Piano piano : piani ){
sb.append("'");
sb.append(piani.getId());
sb.append("', ");
}
sb.append(") inner join ...");
SQLQuery q = getSession().createSQLQuery(sb.toString());
只需确保最后一个钢琴上没有逗号,以确保正确的SQL语法。