JDBI bindBean не может найти именованные параметры

Я пытаюсь обновить строку «Сотрудник» в своей таблице «Сотрудник» с помощью JDBI. Однако методу bindBean мой компонент не нравится. Я включил геттеры и сеттеры. У bean-компонента есть общедоступный конструктор по умолчанию. Имена свойств объекта полностью совпадают с именами столбцов базы данных. Так, например, строка LastName String соответствует столбцу базы данных LastName. Точное совпадение. Что я здесь делаю не так? Я неправильно понимаю, как работает bindBean? Я также попробовал тот же код с префиксом перед параметрами:, но все еще без кубиков.

РЕДАКТИРОВАТЬ: после небольшого дополнительного исследования я считаю, что проблема связана с тем, что имена и свойства моих столбцов начинаются с заглавных букв. Аннотирование моих методов получения и установки с помощью @ColumnName и соответствующих имен столбцов в верхнем регистре, похоже, не помогает.

РЕШЕНИЕ: Простое решение этой проблемы - переименовать именованные параметры в самом запросе, чтобы они соответствовали версии имен свойств в нижнем регистре. т.е. если свойство называется Name, измените параметр в запросе на: name, и проблема будет решена, не касаясь ваших bean-компонентов или столбцов базы данных.

Метод Дао:

    @Override
public void updateEmployee(Employee empl){
    try(Handle handle = daoFactory.getDataSourceController().open()){
        handle.createUpdate("UPDATE Employees SET LastName = :LastName, FirstName = :FirstName, EmailAddress = :EmailAddress, OnVacation = :OnVacation, Active = :Active, EscalationLevel = :EscalationLevel," +
                " ScheduleExempt = :ScheduleExempt, GroupID = :GroupID, ScheduleID = :ScheduleID, SecurityGID = :SecurityGID, JobTitle = :JobTitle, Blurb = :Blurb WHERE IDX = :IDX")
                .bindBean(empl)
                .execute();
        handle.commit();
    }
    catch(Exception e){
        if(verbose){ e.printStackTrace(); }
        logger.logError("Web-EmployeeDaoService-E04", "Error updating single user in DB.");
    }
}

И мой боб:

package app.pojos.Employee;

import java.io.Serializable;
import java.sql.Timestamp;

public class Employee implements Serializable {
    private int IDX;
    private String LastName;
    private String FirstName;
    private String EmailAddress;
    private boolean OnVacation;
    private boolean Active;
    private int EscalationLevel;
    private boolean ScheduleExempt;
    private int GroupID;
    private int ScheduleID;
    private int SecurityGID;
    private String JobTitle;
    private String Blurb;
    private Timestamp LastSeen;
    private String ProfilePic;

    //Default constructor
    public Employee(){}

    //Data mapped getters and setters
    public int getIDX(){ return IDX; }
    public void setIDX(int IDX){ this.IDX = IDX; }

    public String getFirstName(){ return FirstName; }
    public void setFirstName(String firstName){ this.FirstName = firstName; }

    public String getLastName(){ return LastName; }
    public void setLastName(String lastName){ this.LastName = lastName; }

    public String getProfilePic(){ return ProfilePic; }
    public void setProfilePic(String ProfilePic){ this.ProfilePic = ProfilePic; }

    public String getEmailAddress(){ return EmailAddress; }
    public void setEmailAddress(String emailAddress){ this.EmailAddress = emailAddress; }

    public int getGroupID(){ return GroupID; }
    public void setGroupID(int GroupID){ this.GroupID = GroupID; }

    public boolean getScheduleExempt(){ return ScheduleExempt; }
    public void setScheduleExempt(boolean ScheduleExempt){ this.ScheduleExempt = ScheduleExempt; }

    public boolean getOnVacation(){ return OnVacation; }
    public void setOnVacation(boolean OnVacation){ this.OnVacation = OnVacation; }

    public boolean getActive(){ return Active; }
    public void setActive(boolean Active){ this.Active = Active; }

    public int getEscalationLevel(){ return EscalationLevel; }
    public void setEscalationLevel(int EscalationLevel){ this.EscalationLevel = EscalationLevel; }

    public int getScheduleID(){ return ScheduleID; }
    public void setScheduleID(int ScheduleID){ this.ScheduleID = ScheduleID; }

    public int getSecurityGID(){ return SecurityGID; }
    public void setSecurityGID(int SecurityGID){ this.SecurityGID = SecurityGID; }

    public String getJobTitle(){ return JobTitle; }
    public void setJobTitle(String JobTitle){ this.JobTitle = JobTitle; }

    public String getBlurb(){ return Blurb; }
    public void setBlurb(String Blurb){ this.Blurb = Blurb; }

    public Timestamp getLastSeen() { return LastSeen; }
    public void setLastSeen(Timestamp LastSeen) { this.LastSeen = LastSeen; }

    //Extra helper functions
    public String getFullName(){ return this.FirstName + " " + this.LastName; }
}

person TheFunk    schedule 14.02.2021    source источник


Ответы (1)


РЕШЕНИЕ: Простое решение этой проблемы - переименовать именованные параметры в самом запросе, чтобы они соответствовали версии имен свойств в нижнем регистре. т.е. если свойство называется Name, измените параметр в запросе на: name, и проблема будет решена, не касаясь ваших bean-компонентов или столбцов базы данных.

См. этот ответ для ясности. Если вы похожи на меня и совершили ошибку, нарушив лучшие правила именования и написав все свойства bean-компонентов с заглавной буквы, это простое решение. Вам нужно только изменить то, как вы ссылаетесь на свойства в ваших запросах на создание / обновление / вставку, и ничего больше.

person TheFunk    schedule 14.02.2021