SQLQuery.setParameter() 绑定多个同样变量

本文探讨了使用Hibernate框架执行SQL SELECT查询时出现的问题及解决方法。具体表现为使用executeUpdate方法执行SELECT语句导致的异常,并提供了相应的代码示例。

String sql = "SELECT SYS_AUTO_GENR_CURR_DT FROM RBP_ASET_CLASS_DT WHERE CTRY_PROD_EXCHG_MKT_CDE = :exchange AND CTRY_PROD_EXCHG_MKT_CDE = :exchange"

 

SQLQuery query = this.getSessionFactory().getCurrentSession().createSQLQuery(sql);

query.setParameter("exchange", "SH"); // 多个,只需指定一次。

 

List<String> result = query.list();

 

int result = query.executeUpdate();

如果用 executeUpdate() 去 query SELECT, 报错:

org.hibernate.exception.GenericJDBCException: could not execute native bulk manipulation query

 

sql报错识别不了 BETWEEN :startDate and :endDate , public List<EventDataReportDm> getEventDataReportList(int first, int pageSize, Map<String, String> queryMap, Map<String, String> sortMap) { try { this.evictAllEm(); String querySql = this.buildEventDataReportQuery(queryMap, sortMap, false); Query query = this.em.createNativeQuery(querySql); query.setFirstResult(first); query.setMaxResults(pageSize); this.setQueryParameters(query, queryMap); List<Object> list = query.getResultList(); return this.mapResultsToEntities(list); } catch (Exception e) { throw new EJBException(e.getMessage()); } } private String buildEventDataReportQuery(Map<String, String> queryMap, Map<String, String> sortMap, boolean isCountQuery) { StringBuilder sqlBuilder = new StringBuilder(); if (isCountQuery) { //查询记录条数 } else { sqlBuilder.append("SELECT \n" + " a.tag4 AS empNo,\n" + " COUNT(CASE WHEN TIMESTAMPDIFF(MINUTE, a.confirm_time, b.first_transfer) <= 15 THEN 1 END) AS normalCount,\n" + " COUNT(CASE WHEN TIMESTAMPDIFF(MINUTE, a.confirm_time, b.first_transfer) > 15 THEN 1 END) AS timeoutCount\n" + "FROM (\n" + " SELECT \n" + " tag4,\n" + " tag5,\n" + " SUBSTRING_INDEX(data_key, ',', 1) AS order_num,\n" + " SUBSTRING_INDEX(SUBSTRING_INDEX(data_key, ',', 2), ',', -1) AS plate_num,\n" + " MIN(update_date) AS confirm_time -- 唯一标识的最早下机时间\n" + " FROM LKM_EVENT_DATA WHERE data_type = '下机确认' "); if (queryMap != null && !queryMap.isEmpty()) { if (queryMap.get("updateDate") != null && queryMap.get("updateDate").matches("(?i)BETWEEN_.*")) { sqlBuilder.append(" AND update_date BETWEEN :startDate and :endDate "); } } sqlBuilder.append(" GROUP BY \n" + " tag4,\n" + " tag5,\n" + " SUBSTRING_INDEX(data_key, ',', 1),\n" + " SUBSTRING_INDEX(SUBSTRING_INDEX(data_key, ',', 2), ',', -1) "); sqlBuilder.append(" ) a "); sqlBuilder.append(" JOIN (\n" + " SELECT \n" + " tag4,\n" + " tag5,\n" + " SUBSTRING_INDEX(data_key, ',', 1) AS order_num,\n" + " SUBSTRING_INDEX(SUBSTRING_INDEX(data_key, ',', 2), ',', -1) AS plate_num,\n" + " MIN(update_date) AS first_transfer -- 唯一标识的最早转序时间\n" + " FROM LKM_EVENT_DATA\n" + " WHERE data_type = '转序'\n" + " GROUP BY \n" + " tag4,\n" + " tag5,\n" + " SUBSTRING_INDEX(data_key, ',', 1),\n" + " SUBSTRING_INDEX(SUBSTRING_INDEX(data_key, ',', 2), ',', -1)\n" + ") b ON a.tag4 = b.tag4\n" + " AND a.tag5 = b.tag5\n" + " AND a.order_num = b.order_num\n" + " AND a.plate_num = b.plate_num\n" + "GROUP BY a.tag4; "); } logger.info("ZhuanXuSql:"+sqlBuilder.toString()); return sqlBuilder.toString(); } private void setQueryParameters(Query query, Map<String, String> queryMap) { if (queryMap != null) { if (queryMap.containsKey("tag4") && StringUtils.isNotBlank((String) queryMap.get("tag4"))) { query.setParameter("tag4", queryMap.get("tag4")); } if (queryMap.get("updateDate") != null && queryMap.get("updateDate").matches("(?i)BETWEEN_.*")) { String[] val = queryMap.get("updateDate").substring(8).split(","); if (val != null && val.length == 2) { logger.info("startDate:" + val[0]); logger.info("endDate:" + val[1]); query.setParameter("startDate", val[0]); query.setParameter("endDate", val[1]); } } } }
08-21
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值