Just for an update in my efforts to track down this error, I put in
breakpoints, and the setters for the fields that are coming up null are
never called. For the fields where the setters are called, everything is
set and displays properly.
On advice from Larry, I made some changes to my xml file. While these
changes have not fixed the problem, they make the file much smaller, so it
should be easier to spot an error there if there is one (I can't find any).
I also changed the date fields in my airport class to be of type
java.util.Date, instead of String. I still get no return value from these
fields.
The new xml file (no longer has a resultmap):
<sqlMap namespace="Airport">
<select id="getAirportList" resultClass="domain.Airport">
SELECT
AIRPORT.AIRPORT_ID as "id",
AIRPORT.IATA_CODE as "iataCode",
AIRPORT.ICAO_CODE as "icaoCode",
AIRPORT.LATITUDE as "latitude",
AIRPORT.LONGITUDE as "longitude",
AIRPORT.START_DATE as "startDate",
AIRPORT.END_DATE as "endDate",
AIRPORT_NAME.NAME as "name"
FROM AIRPORT, AIRPORT_NAME
WHERE
AIRPORT.AIRPORT_ID = AIRPORT_NAME.AIRPORT_ID AND
AIRPORT_NAME.MAIN_FLG = 1
</select>
</sqlMap>
-----Original Message-----
From: David Momper [mailto:[EMAIL PROTECTED]
Sent: Thursday, May 01, 2008 11:56 AM
To: [email protected]
Subject: DAO class not getting values from query
Hi all,
I have a page that displays a list or airports from a database query. The
page displays the correct database values from some fields, null values from
others. Through debugging, I have figured out that the fields that display
as null are never set to begin with, but as best I can tell, they should be.
Some of the fields with problems are identical in structure to fields with
no problems. Latitude/longitude, and airport id are all Integers in my java
class, and are NUMBER in Oracle. Lat/lon get proper values, id remains
null. Of the fields I query, only latitude, longitude, and name get
non-null values. I have verified that if I directly perform the query
against the database, all proper values are returned, so the query is not my
problem. I suspect that the problem lies in my resultMap, but I haven't
been able to figure out what is wrong there.
I use Ibatis and Spring, with an Oracle 10g database. Relevant code is
included below. Any help would be greatly appreciated.
The SQL map xml file:
<sqlMap namespace="Airport">
<resultMap id="result" class="domain.Airport">
<result property="id" javaType="Integer" jdbcType="NUMBER"
column="AIRPORT_ID" columnIndex="1"/>
<result property="iataCode" javaType="String"
jdbcType="CHAR(3)" column="IATA_CODE" columnIndex="2"/>
<result property="icaoCode" javaType="String"
jdbcType="CHAR(4)" column="ICAO_CODE" columnIndex="3"/>
<result property="latitude" javaType="Integer"
jdbcType="NUMBER" column="LATITUDE" columnIndex="4"/>
<result property="longitude" javaType="Integer"
jdbcType="NUMBER" column="LONGITUDE" columnIndex="5"/>
<result property="startDate" javaType="String"
jdbcType="TIMESTAMP" column="START_DATE" columnIndex="6"/>
<result property="endDate" javaType="String"
jdbcType="TIMESTAMP" column="END_DATE" columnIndex="7"/>
<result property="name" javaType="String"
jdbcType="VARCHAR2" column="NAME" columnIndex="8"/>
</resultMap>
<select id="getAirportList" resultClass="domain.Airport">
SELECT
AIRPORT.AIRPORT_ID,
AIRPORT.IATA_CODE,
AIRPORT.ICAO_CODE,
AIRPORT.LATITUDE,
AIRPORT.LONGITUDE,
AIRPORT.START_DATE,
AIRPORT.END_DATE,
AIRPORT_NAME.NAME
FROM AIRPORT, AIRPORT_NAME
WHERE AIRPORT.AIRPORT_ID = AIRPORT_NAME.AIRPORT_ID
AND AIRPORT_NAME.MAIN_FLG = 1
</select>
</sqlMap>
AirportSqlMapDao class has:
public List<Airport> getAirportList() {
return
(List<Airport>)getSqlMapClientTemplate().queryForList("getAirportList");
}
The fields from the Airport class. Getter/setter methods are typical
getter/setters.
private Integer id;
private String name;
private String iataCode;
private String icaoCode;
private Integer latitude;
private Integer longitude;
private String startDate, endDate;
My manager class:
public class SimpleAirportManager implements AirportManager {
private AirportDao airportDao;
public List<Airport> getAirports() {
return airportDao.getAirportList();
}
public void setAirportDao(AirportDao airportDao) {
this.airportDao = airportDao;
}
}
My controller has the code:
public ModelAndView handleRequest(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
Map<String, Object> myModel = new HashMap<String, Object>();
myModel.put("airports", this.airportManager.getAirports());
return new ModelAndView("hello", "model", myModel);
}
This is the code from the display page:
<table border=1>
<tr><td>ID</td><td>Name</td><td>IATA code</td><td>ICAO
code</td><td>Latitude</td><td>Longitude</td><td>Start Date</td><td>End
Date</td></tr>
<c:forEach items="${model.airports}" var="arpt">
<tr>
<td><c:out value="${arpt.id}"/></td>
<td><c:out value="${arpt.name}"/></td>
<td><c:out value="${arpt.iataCode}"/></td>
<td><c:out value="${arpt.icaoCode}"/></td>
<td><c:out value="${arpt.latitude}"/></td>
<td><c:out value="${arpt.longitude}"/></td>
<td><c:out value="${arpt.startDate}"/></td>
<td><c:out value="${arpt.endDate}"/></td>
</tr>
</c:forEach>
</table>