休眠创建SQLQuery给出异常 - 字符串索引超出范围:0



对于下面提到的逻辑实现的获取异常(java.lang.StringIndexOutOfBoundsException:字符串索引超出范围:0)在行:结果= 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();
        }

在免疫合规DTO中,我确实进行了以下更改。仍然没有运气得到同样的问题...

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

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

完整的吸气剂设置器如下所示。

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

因此,性别/性别列似乎具有空值,为了克服该问题,请在查询中添加以下内容

"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();
        }

最新更新