【问题标题】:get the type of a column from native Query Jpa从本机查询 Jpa 获取列的类型
【发布时间】:2022-11-26 07:14:42
【问题描述】:

我正在从 EclipseLink 迁移到 Hibernate

问题是识别结果的类型,或者转换并分配一个字母 F = Dates, S = String, N = Number

String table = /*variable*/ 

 String sentencia = "SELECT * FROM " + table + where;
                                
          
            Vector registrosRS = 
                session.executeSelectingCall(new SQLCall(sentencia));        
         
            for (int i = 0; i < registrosRS.size(); i++) {
                Record registro = (Record)registrosRS.get(i);

                for (Iterator iterator = registro.entrySet().iterator(); 
                     iterator.hasNext(); ) {
                    Map.Entry columna = (Map.Entry)iterator.next();
                    DatabaseField campo = (DatabaseField)columna.getKey();
                  
                    if (i == 0) {
                       
                       nombreCol = campo.getName();
                       String type =  define(campo);
                        definiciones.put(nombreCol, type);
                    }

            }

DatabaseField 是 EclipseLink 的一个类,让我们检查类型


public String define(DatabaseField campo) {

        _log.debug("JDBC Type java: " + JDBCType.valueOf(campo.getSqlType()));
        if (JDBCType.valueOf(campo.getSqlType()).equals(JDBCType.TIMESTAMP) ||
                JDBCType.valueOf(campo.getSqlType()).equals(JDBCType.TIME) ||
                JDBCType.valueOf(campo.getSqlType()).equals(JDBCType.TIME_WITH_TIMEZONE) ||
                JDBCType.valueOf(campo.getSqlType()).equals(JDBCType.TIMESTAMP_WITH_TIMEZONE) ||
                JDBCType.valueOf(campo.getSqlType()).equals(JDBCType.DATE)) {
            return "F";
        } else if (JDBCType.valueOf(campo.getSqlType()).equals(JDBCType.NUMERIC) ||
                JDBCType.valueOf(campo.getSqlType()).equals(JDBCType.DECIMAL) ||
                JDBCType.valueOf(campo.getSqlType()).equals(JDBCType.BIGINT) ||
                JDBCType.valueOf(campo.getSqlType()).equals(JDBCType.TINYINT) ||
                JDBCType.valueOf(campo.getSqlType()).equals(JDBCType.SMALLINT) ||
                JDBCType.valueOf(campo.getSqlType()).equals(JDBCType.DOUBLE) ||
                JDBCType.valueOf(campo.getSqlType()).equals(JDBCType.FLOAT)) {
          return "N";
        } else if (JDBCType.valueOf(campo.getSqlType()).equals(JDBCType.VARCHAR) ||
                JDBCType.valueOf(campo.getSqlType()).equals(JDBCType.NVARCHAR) ||
                JDBCType.valueOf(campo.getSqlType()).equals(JDBCType.CHAR) ||
                JDBCType.valueOf(campo.getSqlType()).equals(JDBCType.LONGVARCHAR)) {
           return "C";
        } else {
            _log.error("Capturo tipo no especificado: " + campo.getSqlType() + " - " + campo.getName());
        }


   }

我试过了,但我没有在 Hibernate 中找到任何替代方案

【问题讨论】:

    标签: hibernate jpa eclipselink


    【解决方案1】:

    在 Hibernate 中,您可以检查 java 类。 假设 SQL 只返回一列:

    String sql = "select column1 from ... ";
    List<Object> resultList = em.createNativeQuery(sql).getResultList();
    for (Object result : resultList) {
       if (result instanceof String ) {
          // Do something with a String
       } else if ( result instanceof Number ) {
          // Do something with a Number
       } else if ( result instanceof Date ) {
          // Do something with a date
       } else ...   
    }
    

    如果您有多个列,它将是 List&lt;Object[]&gt;

    除非您需要确切的列类型,否则它可能比检查每种可能的 sql 类型更容易。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-11-11
      • 2023-01-20
      • 2017-11-21
      • 2016-11-02
      • 2012-10-09
      • 2016-09-30
      • 1970-01-01
      • 2012-11-14
      相关资源
      最近更新 更多