[
https://issues.apache.org/jira/browse/IBATIS-480?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12709490#action_12709490
]
Satish Kumar Nookala commented on IBATIS-480:
---------------------------------------------
Yes we need "optional" mapping of columns to properties. In my current project,
I have one DTO class which has all the properties mapping to a table. But I use
the DTO and fill only the properties I need based on a use case, by running
different queries.
Currently to achieve this, I am using different "resultMaps" with required
properties, but with the exact properties coming from the query. This is vary
laborious, as I need to create multiple resultMaps for the same DTO.
Regards,
Satish.
> support the parameter('#') in the replace string('$') and the result column
> of result map(class) not existed in select statement.
> ---------------------------------------------------------------------------------------------------------------------------------
>
> Key: IBATIS-480
> URL: https://issues.apache.org/jira/browse/IBATIS-480
> Project: iBatis for Java
> Issue Type: Improvement
> Components: SQL Maps
> Affects Versions: 2.3.0
> Environment: iBatis 2.3.0
> Reporter: KwonKee Lim
> Priority: Minor
> Attachments: BasicResultMap.java, DynamicSql.java
>
>
> 1. support the parameter('#') in the replace string('$')
> in the following sqlmap
> <typeAlias alias="Test" type="...model.impl.TestImpl"/>
> <resultMap id="TestResult" class="Test">
> <result column="COL1" jdbcType="VARCHAR" property="COL1"
> javaType="String"/>
> <result column="COL2" jdbcType="VARCHAR" property="COL2"
> javaType="String"/>
> <result column="COL3" jdbcType="DECIMAL" property="COL3"
> javaType="long" nullValue="0"/>
> <result column="COL4" jdbcType="DECIMAL" property="COL4"
> javaType="long" nullValue="0"/>
> </resultMap>
> <select id="getTestsBySQL" parameterClass="Map" resultMap="TestResult">
> SELECT COL1,COL2,COL3
> FROM Test
> WHERE
> $SQL$
> <isPropertyAvailable property="COL2" prepend="AND ">COL2 =
> #COL2#</isPropertyAvailable>
> </select>
> if the replace string '$SQL$' is 'COL1=#COL1#', the result sql string is '...
> WHERE COL1=#COL1#' .. ' .
> The sql exception occured , because the '#COL1#' in 'COL1=#COL1#' not
> replaced to '?'.
> That is, the parameter('#') is not supperted in dynamic sql('$').
> My idea is that modify the
> "com.ibatis.sqlmap.engine.mapping.sql.dynamic.DynamicSql" class 's
> processBodyChildren method for dynamic sql('$').
> private void processBodyChildren(RequestScope request, SqlTagContext ctx,
> Object parameterObject, Iterator localChildren, PrintWriter out) {
> while (localChildren.hasNext()) {
> SqlChild child = (SqlChild) localChildren.next();
> if (child instanceof SqlText) {
> SqlText sqlText = (SqlText) child;
> String sqlStatement = sqlText.getText();
> // CUSTOMIZE for support '#' in '$' by kklim 2007-12-26 <== here
> // if the '$' is included , parsing one more.
> if (SimpleDynamicSql.isSimpleDynamicSql(sqlStatement)) {
> sqlStatement = new SimpleDynamicSql(delegate,
> sqlStatement).getSql(request, parameterObject);
> sqlText.setPostParseRequired(true);
> }
> // CUSTOMIZE end
> ...
> What do you think about this idea?
> 2. support the result column of result map(class) not existed in select
> statement.
> In the above sql map, the select statement's column is missing the column
> 'COL4', but the result map present the column 'COL4'.
> In case, The select statement 's columns in runtime is defined. a column
> presented by the result map is able to be missed.
> My idea is that modify the
> "com.ibatis.sqlmap.engine.mapping.result.BasicResultMap" class.
> 1) define the member variable for cached the resultsetmetadata's column(s)
> // CUSTOMIZE does not exist column in resultmap for result set
> private ThreadLocal rsmd = new ThreadLocal();
> 2) to initialize the the resultsetmetadata's column(s), modify the
> "getResults" method
> // CUSTOMIZE initialize the columns of the resultset
> if(rsmd.get() == null){
> ResultSetMetaData md = rs.getMetaData();
> int count = md.getColumnCount();
> Map columnNameMap = new HashMap(count);
> for(int i=0; i<count; i++){
> String columnName = md.getColumnName(i+1);
> columnNameMap.put(columnName, (i+1));
> }
> rsmd.set(columnNameMap);
> }
> // CUSTOMIZE END
> 3) to get the result's column , if the result map(class)'s columns does not
> exists, skip the getting the result colum
> in getNestedSelectMappingValue method
> // CUSTOMIZE if not exist the column(s) of query, skip the column of
> the result map(class)
> Map columnNameMap = (Map)rsmd.get();
> if( columnNameMap == null ||
> columnNameMap.containsKey(mapping.getColumnName())){
> result = ResultLoader.loadResult(client, statementName,
> parameterObject, targetType);
> }
> // CUSTOMIZE END
> and in getPrimitiveResultMappingValue method
> protected Object getPrimitiveResultMappingValue(ResultSet rs,
> BasicResultMapping mapping) throws SQLException {
> Object value = null;
> // CUSTOMIZE if not exist the column(s) of query, skip the column of
> the result map(class)
> Map columnNameMap = (Map)rsmd.get();
> if( columnNameMap != null &&
> !columnNameMap.containsKey(mapping.getColumnName())){
> return value;
> }
> ...
> What do you think about this idea?
--
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.