mybatis根据参数自定义SQL

@Mapper
public interface ProductMapper {
    @Select("select * from tb_p")
    public List<Product> getAllProducts();
    
    @SelectProvider(type = CHMapperProvider.class, method = "getFunnelByEvents")
    public ResultBean autoFinnel(Event e);
    class CHMapperProvider {
        public static  String getFunnelByEvents(Event e) {
            String evs = e.getEvs();
            String[] split = evs.split("-");
            StringBuilder sb = new StringBuilder();
            StringBuilder sum = new StringBuilder();
            StringBuilder res = new StringBuilder();

            for (int i = 0; i < split.length; i++) {
                sb.append("eventId='" + split[i]+"'").append(",");
                // sum.append("sum(if(cc=="+split.length-i+" ++",1,0)) as s,")
                sum.append("sum(if(cc==").append(split.length - i).append(",1,0)) AS v").append(i + 1 + ",");
                for (int j = split.length - i; j > 0; j--) {
                    res.append("v").append(j + "+");
                }
                res.deleteCharAt(res.length() - 1).append(" o").append(i + 1).append(",");
            }
            String es = sb.deleteCharAt(sb.length() - 1).toString();
            String sm = sum.deleteCharAt(sum.length() - 1).toString();
            String rr = res.deleteCharAt(res.length() - 1).toString();
            String sql = "select \n" +
                    "total,\n" +
                    rr +
                    " from\n" +
                    "(select\n" +
                    "count(1) total ,\n" +
                    sm +
                    " from\n" +
                    "(select\n" +
                    "deviceId ,\n" +
                    "windowFunnel(3600)(\n" +
                    "toDateTime(ctime) ,\n" +
                    es +
                    ") as cc\n" +
                    "from\n" +
                    "tb_log \n" +
                    "group by deviceId));";

            return sql;
        }

    }


}

猜你喜欢

转载自blog.csdn.net/qq_37933018/article/details/109325400