[Hibernate] Khắc phục lỗi Remember that ordinal parameters are 1-based! – HibernateTemplate

Vấn đề
Code sử dụng HibernateTemplate …
Java:
getHibernateTemplate().find("from Domain d
where d.domainName = :domainName", domainName);
Khi chạy đoạn code trên, sẽ xuất hiện lỗi sau
Code:
java.lang.IndexOutOfBoundsException: Remember that ordinal parameters are 1-based!
    ...
    at org.hibernate.impl.AbstractQueryImpl.determineType(AbstractQueryImpl.java:397)
    at org.hibernate.impl.AbstractQueryImpl.setParameter(AbstractQueryImpl.java:369)

Giải pháp
Đi sâu vào bên trong và đọc code trong file HibernateTemplate.java sẽ thấy đoạn code sau
Java:
public List find(final String queryString, final Object[] values) throws DataAccessException {
    return (List) executeWithNativeSession(new HibernateCallback() {
        public Object doInHibernate(Session session) throws HibernateException {
            Query queryObject = session.createQuery(queryString);
            prepareQuery(queryObject);
            if (values != null) {
                for (int i = 0; i < values.length; i++) {
                    queryObject.setParameter(i, values[i]);
                }
            }
            return queryObject.list();
        }
    });
}
Trong đoạn code trên, HibernateTemplete đang lấy 0 làm vị trí bắt đầu của mảng thay vì 1. Đây là vấn đề của spring hay hibernate? Vì thông báo lỗi đã nêu các tham số cần bắt đầu là 1. Tôi đã thử một số giải pháp như thay đổi spring hoặc hibernate, tuy nhiên nó không chạy...

Có vẻ như ta đang đi sai hướng, phải bắt đầu tìm giải pháp ngay từ đầu, đầu tiên mình đọc lại code!!! Không thể hình dung được mình bất cẩn như thế nào, mình đã mắc một lỗi ngu ngốc trong code, đây không phải là vấn đề của spring hay hibernate, đó là lỗi cú pháp trong code.

Thay đổi từ
Java:
getHibernateTemplate().find("
    from Domain d where d.domainName = :domainName", domainName);
Thành
Java:
getHibernateTemplate().find("
    from Domain d where d.domainName = ?", domainName);
Vấn đề được giải quyết, code chạy tốt và không phát sinh lỗi.


Ghi chú
Thông báo lỗi của HibernateTemplate thực sự đã gây hiểu lầm!!!


Cám ơn các bạn đã theo dõi. Hẹn gặp lại các bạn trong các bài viết sau :D

Bài viết tham khảo tại: https://mkyong.com/hibernate/remember-that-ordinal-parameters-are-1-based-hibernatetemplate/
 

Bình luận