使用Java根据条件返回不同类型的对象

时间:2018-12-26 11:18:11

标签: java jdbc spring-jdbc jdbctemplate

我有三个查询

SELECT NAME FROM EMP WHERE EMPID=100; // THIS RETURNS A STRING

SELECT DEPTID FROM EMP WHERE EMPID=100; // THIS RETURNS AN INT

SELECT EMPID FROM DEPT WHERE DEPTID=101; // THIS RETURNS A LIST

现在我正在尝试编写通用代码以返回对象,但是我只能发送一种类型,即高级对象列表。是否可以根据类型发送结果?

这是我的代码

public Object getObjectFromDB(final String query, final Map<Object, Object> inputMap, JdbcTemplate jdbcTemplate, final Object returnType) throws Exception {

    final List<Object> obj = new ArrayList<Object>();
    try {
        jdbcTemplate.query(new PreparedStatementCreator() {             
            @Override
            public PreparedStatement createPreparedStatement(Connection con) throws SQLException {
                return con.prepareStatement(query);
            }
        }, new PreparedStatementSetter() {
            @Override
            public void setValues(PreparedStatement ps) throws SQLException {

            }
        }, new ResultSetExtractor<Object>() {
            @Override
            public Object extractData(ResultSet rs) throws SQLException,DataAccessException {
                while(rs.next()) {
                    if(returnType instanceof Integer) {
                        obj.add(rs.getInt(1));   
                        break;                        
                    } else if(returnType instanceof String) {
                        obj.add(rs.getString(1));
                        break;
                    } else if(returnType instanceof List) {
                        obj.add(rs.getObject(1));
                    }

                }
                return obj;
            }
        });
    } catch (Exception e) {
        LOG.error(e);
    }
    return obj;
}   

即使我想触发第一个查询,它总是返回作为列表对象的obj。任何想法将不胜感激。

2 个答案:

答案 0 :(得分:1)

您是否尝试编写泛型方法?有关更多信息,请参见Generic Methods。如果您已经知道传递给方法的任何特定参数集所期望的返回类型,则可以轻松进行此操作。

post描述了如何编写具有通用返回类型的方法。

一种可能的功能原型可以是:

public static <T> List<T> getObjectFromDB(final String query, final Map<Object, Object> inputMap, JdbcTemplate jdbcTemplate, T returnType){
}

答案 1 :(得分:0)

在您在此处声明时,它将始终返回List<Object>

final List<Object> obj = new ArrayList<Object>();

尝试检查obj的第一个元素(因为它是一个列表)及其类型。