Как сделать аннотацию Fanbatis @Column для правильного сопоставления атрибута класса Fantom со столбцом БД?

Я использую инфраструктуру Fanbatis для доступа к базе данных MySQL. Документация здесь: http://www.talesframework.org/fanbatis/ говорит, что я могу использовать аннотацию @Column для сопоставления атрибута класса столбцу с другим именем:

@Column{name="xx"} - By default column name is assumed to be the field name, 
                     to change this use this annotation on a field 

У меня есть этот класс...

using fanbatis

@Table {name = "APPS"}
class App
{
  @Primary 
  Str? id
  Str? name
  @Column{name="description"}
  Str? descr
}

И таблица APPS, созданная с помощью этого SQL:

create table APPS (
    ID              varchar(36)     not null,
    NAME            varchar(100)    not null,
    DESCRIPTION     varchar(400)    ,
    primary key (ID)
);

И я пытаюсь извлечь запись из базы данных, используя этот DAO

class AppDao
{
  static App? findById(Str id)
  {
    S<|
      select * from apps where id = #{id}
    |>
  }
}

Мой код компилируется нормально, но когда я запускаю его, передавая идентификатор существующей записи, он извлекает запись из базы данных и устанавливает значения атрибутов, которые соответствуют именам столбцов, но app.descr остается нулевым. Однако если я просто удаляю аннотацию @Column из атрибута "descr" и переименовываю ее, чтобы она соответствовала столбцу ("описание"), тогда код работает нормально и возвращает ожидаемые значения.

- Запустите:  auth::TestAppDao.testFindById... Тестовая настройка!
app.id: 0615a6cb-7bda-cc40-a274-00130281bd51
app.name: MyApp
app.descr: null

TEST FAILED
sys::TestErr: Тест не пройден: null!= "MyApp descr" [sys::Str]
  fan.sys.Test.err (Test.java:206)
  fan.sys.Test.fail (Test.java:198)
  fan.sys.Test.verifyEq (Test.java:121)
  fan.sys.Test.verifyEq (Test.java:90)
  auth::TestAppDao.testFindById (TestAppDao.fan:36)
  java.lang.reflect.Method.invoke (Неизвестно)
  fan.sys.Method.invoke (Method.java:559)
  fan.sys.Method$MethodFunc.callList (Method.java:204)
  fan.sys.Method.callList (Method.java:138)
  fanx.tools.Fant.runTest (Fant.java:191)
  fanx.tools.Fant.test (Fant.java:110)
  fanx.tools.Fant.test (Fant.java:32)
  fanx.tools.Fant.run (Fant.java:284)
  fanx.tools.Fant.main (Fant.java:327) Тестовый демонтаж!

Я делаю что-то не так или это ошибка в Fanbatis?

1 ответ

Это может быть связано с чувствительностью к регистру - см. MySQL 9.2.2. Идентификатор регистра чувствительности

Хотя имена баз данных и таблиц не чувствительны к регистру на некоторых платформах, вы не должны ссылаться на конкретную базу данных или таблицу, используя разные регистры в пределах одного и того же оператора. Следующее утверждение не будет работать, поскольку оно ссылается на таблицу как my_table и MY_TABLE:

mysql> SELECT * FROM my_table WHERE MY_TABLE.col=1;

Пытаться:

@Column{name="DESCRIPTION"}

Это также упоминается в этом вопросе.

Другие вопросы по тегам