Получение одного объекта класса модели в среде Spring

Привет, ребята, я разрабатываю весеннее приложение и застрял на одном месте. Что я делаю, так это извлекаю данные из базы данных с помощью spring rowmapper. Проблема заключается в том, что при реализации класса класса rowmapper объект класса модели создает ровно столько же строк, сколько раз, поэтому, если в таблице 10 строк, создается 10 объектов класса модели. Я хочу создать только один объект этого класса модели, поэтому я ввел класс модели в класс dao, но в результате он возвращает данные последней строки только 10 раз.

Класс модели

public class Item {
    private String ItemId;
    private String ItemName;
    private String price;

   // getter & setter
}

класс ДАО

public class Itemdao {
    private JdbcTemplate template;
    private Item items;

    public JdbcTemplate getTemplate() {
        return template;
    }

    public void setTemplate(JdbcTemplate template) {
        this.template = template;
    }

    public List<Item> getItem(){

        return template.query("select * from item", new RowMapper<Item>(){

        @Override
            public Item mapRow(ResultSet rs, int rownum) throws SQLException                
            {
            //Item item = new Item(); // Using this line I get 10 objects of model
                items.setItemId(rs.getString(1));
                items.setItemName(rs.getString(2));
                items.setPrice(rs.getString(3));
                return items;
            }});
       }

    public Item getItems() {
        return items;
    }

    public void setItems(Item items) {
        this.items = items;
    }
   }

Основной класс

public class test {
     public static void main(String[] args) {
        ApplicationContext context = new ClassPathXmlApplicationContext("spconfig.xml");
        Itemdao dItemdao = (Itemdao)context.getBean("item");
        List<Item> list = dItemdao.getItem();
        for(Item i:list)
          System.out.println(i);
        }
    }

Конфигурация пружины

<beans>
<bean id="ds" class="org.springframework.jdbc.datasource.DriverManagerDataSource">  
    <property name="driverClassName" value="oracle.jdbc.driver.OracleDriver" />  
    <property name="url" value="jdbc:oracle:thin:@localhost:1521:xe" />  
    <property name="username" value="sandhya" />  
    <property name="password" value="2611798" />  
</bean>  

<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">  
    <property name="dataSource" ref="ds"/>  
</bean>
<bean id="items" class="com.shopping.Item.Model.Item"/>
<bean id="item" class="com.shopping.Item.Model.Itemdao">
    <property name="template" ref="jdbcTemplate"/>
    <property name="items" ref="items"/>
</bean>

</beans>

person Vivek Singh    schedule 20.10.2016    source источник
comment
А что вы ожидаете? Если у вас есть 10 строк в базе данных, и вы хотите, чтобы в списке был только один элемент? Либо обновите свой запрос, чтобы получить единственную строку, которую вы ожидаете (возможно, может помочь ключевое слово distict или некоторые дополнения к предложению where), либо обработайте дубликаты после выборки и сопоставления данных.   -  person Nadir    schedule 20.10.2016
comment
Мне нужны полные данные строки. Используя первый подход, то есть используя новый Item(), я получаю все данные, как хочу, но объект класса модели также создает нет. строк раз. нет проблемы дублирования. Я просто хочу создать только один объект класса Model.   -  person Vivek Singh    schedule 20.10.2016
comment
Таким образом, ваш модельный класс должен содержать список элементов, а не элемент, см. Ответ @Sundararaj Govindasamy, должен быть полезен   -  person Nadir    schedule 20.10.2016
comment
Вы действительно должны сделать так, чтобы ваш метод dao выдавал список объектов, как сейчас. При использовании запроса на выборку нельзя быть уверенным, что запрос всегда и в каждом случае будет выдавать только одну строку данных => один объект. jdbcTemplate.queryForObject() создаст только один объект, но если в результате запроса будет 0, 2 или более строк, это вызовет ошибку (исключение) и сломает ваше приложение.   -  person micaro    schedule 20.10.2016


Ответы (1)


Используйте queryForObject() вместо query(). См. этот документ по Java из JDBCTemplate для всех доступных API.

Обратитесь к этому примеру,

public Customer findByCustomerId(int custId){

    String sql = "SELECT * FROM CUSTOMER WHERE CUST_ID = ?";

    Customer customer = (Customer)getJdbcTemplate().queryForObject(
            sql, new Object[] { custId }, new CustomerRowMapper());

    return customer;
}
person Sundararaj Govindasamy    schedule 20.10.2016