【问题标题】:Hibernate createSQLQuery giving exception - String index out of range: 0Hibernate createSQLQuery 给出异常 - 字符串索引超出范围:0
【发布时间】:2017-11-08 17:24:44
【问题描述】:

对于下面提到的逻辑实现get exception (java.lang.StringIndexOutOfBoundsException: String index out of range: 0) at line : result = q.list();

我确定在许多地方性别为空。查询时还有其他方法可以检查 null 吗?

 beginTransaction();
        try {
            SQLQuery q = getSession().createSQLQuery("SELECT DISTINCT " +
                                                     "ind.ind_id AS id, " +
                                                     "ind.IND_FNAME AS firstName, " +
                                                     "ind.IND_LNAME AS lastName, " +
                                                     "perInfo.IND_DOB AS dob, " +
                                                     "trc.trCTM_Grade_Mapping AS grade, " +
                                                     "TIMESTAMPDIFF(YEAR, perInfo.IND_DOB, NOW()) AS years, " +
                                                     "TIMESTAMPDIFF(MONTH, perInfo.IND_DOB, NOW())  AS months, " +
                                                     "perInfo.IND_SEX AS sex " +
                                                         "FROM INDIVIDUALS ind " +
                                                             "INNER JOIN USER_MEMBERSHIPS usm on usm.USR_ID = ind.IND_ID " +
                                                             "INNER JOIN PERSONAL_INFO perInfo on perInfo.IND_ID = ind.IND_ID " +
                                                             "INNER JOIN TRACKER_CUSTOM_DASHBOARD trcd on perInfo.IND_ID = trcd.USR_ID  " +
                                                             "INNER JOIN TRACKER_CUSTOM trc on trcd.trCTM_MainID = trc.trCTM_MainID " +
                                                         "WHERE usm.GRP_ID = :GRP_ID ;");


            q.setInteger ("GRP_ID", groupId);
            q.setResultTransformer (Transformers.aliasToBean (ImmunizationsComplianceDTO.class));
            result = q.list();
        }catch(RuntimeException e) {
            rollbackTransaction();
            handleHibernateException(e);
            throw e;
        } finally {
            closeTransaction();
        }

【问题讨论】:

    标签: hibernate


    【解决方案1】:

    在 ImmunizationsComplianceDTO 中,我确实进行了以下更改。仍然没有运气遇到同样的问题......

    不是简单地添加getter和setter,而是添加了对性别的空检查

     if(gender != null){
                    this.sex = gender;
                }
    

    完整的getter setter如下所示。

    // Getter setter for gender of the student.
        public Character getSex() {
            return sex;
        }
        public void setSex(Character gender) {
            if(gender != null){
                this.sex = gender;
            }
        }
    

    【讨论】:

      【解决方案2】:

      所以看起来性别/性别列有空值,为了克服这个问题,在查询中添加了以下内容

      "COALESCE(perInfo.IND_SEX, '') AS sex" +
      

      所以最终的查询看起来像

      beginTransaction();
              try {
                  SQLQuery q = getSession().createSQLQuery("SELECT DISTINCT " +
                                                           "ind.ind_id AS id, " +
                                                           "ind.IND_FNAME AS firstName, " +
                                                           "ind.IND_LNAME AS lastName, " +
                                                           "perInfo.IND_DOB AS dob, " +
                                                           "trc.trCTM_Grade_Mapping AS grade, " +
                                                           "TIMESTAMPDIFF(YEAR, perInfo.IND_DOB, NOW()) AS years, " +
                                                           "TIMESTAMPDIFF(MONTH, perInfo.IND_DOB, NOW())  AS months, " +
                                   "COALESCE(perInfo.IND_SEX, '') AS gender" + 
                                                               "FROM INDIVIDUALS ind " +
                                                                   "INNER JOIN USER_MEMBERSHIPS usm on usm.USR_ID = ind.IND_ID " +
                                                                   "INNER JOIN PERSONAL_INFO perInfo on perInfo.IND_ID = ind.IND_ID " +
                                                                   "INNER JOIN TRACKER_CUSTOM_DASHBOARD trcd on perInfo.IND_ID = trcd.USR_ID  " +
                                                                   "INNER JOIN TRACKER_CUSTOM trc on trcd.trCTM_MainID = trc.trCTM_MainID " +
                                                               "WHERE usm.GRP_ID = :GRP_ID ;");
      
      
                  q.setInteger ("GRP_ID", groupId);
                  q.setResultTransformer (Transformers.aliasToBean (ImmunizationsComplianceDTO.class));
                  result = q.list();
              }catch(RuntimeException e) {
                  rollbackTransaction();
                  handleHibernateException(e);
                  throw e;
              } finally {
                  closeTransaction();
              }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-07-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-08-12
        相关资源
        最近更新 更多