@Override
 public void saveOrUpdate(ChannelSeverity channelSeverity) {
   if (channelSeverity.getSeverityMap() != null) {
     sessionFactory.getCurrentSession().saveOrUpdate(channelSeverity.getSeverityMap());
   }
   sessionFactory.getCurrentSession().saveOrUpdate(channelSeverity);
   sessionFactory.getCurrentSession().flush();
   sessionFactory.getCurrentSession().refresh(channelSeverity);
 }
  @Override
  public ChannelSeverity retrieveByCode(ChannelType channelType, String code) {

    // To avoid case insensitive query in MySQL
    List<ChannelSeverity> channelSeverities =
        (List<ChannelSeverity>)
            sessionFactory
                .getCurrentSession()
                .createQuery(
                    "from ChannelSeverity cs where cs.code = :code "
                        + "and cs.channelType = :channelTypeId")
                .setString("code", code)
                .setInteger("channelTypeId", channelType.getId())
                .list();

    if (channelSeverities == null || channelSeverities.size() == 0) return null;

    for (ChannelSeverity channelSeverity : channelSeverities) {
      if (code.equals(channelSeverity.getCode())) return channelSeverity;
    }

    return null;
  }
  @Override
  public void updateExistingVulns(List<Integer> channelSeverityIds) {

    for (Integer channelSeverityId : channelSeverityIds) {
      ChannelSeverity channelSeverity = retrieveById(channelSeverityId);
      if (channelSeverity == null) continue;

      String subquery =
          "(select finding.vulnerability.id "
              + "from Finding finding "
              + "where finding.channelSeverity.id = :channelSeverityId "
              + "and finding.firstFindingForVuln = true)";

      sessionFactory
          .getCurrentSession()
          .createQuery(
              "update Vulnerability vulnerability "
                  + "set genericSeverity = :genericSeverity "
                  + "where id in "
                  + subquery)
          .setParameter("channelSeverityId", channelSeverityId)
          .setParameter("genericSeverity", channelSeverity.getSeverityMap().getGenericSeverity())
          .executeUpdate();

      sessionFactory
          .getCurrentSession()
          .createQuery(
              "update StatisticsCounter counter "
                  + "set currentGenericSeverityId = :genericSeverityId "
                  + "where vulnerabilityId in "
                  + subquery)
          .setParameter("channelSeverityId", channelSeverityId)
          .setParameter(
              "genericSeverityId", channelSeverity.getSeverityMap().getGenericSeverity().getId())
          .executeUpdate();
    }
  }