jooq - изберете премахва информацията за дължината на varchar на каста

при извикване на този код

DSLContext dslContext = DSL.using(SQLDialect.SQLSERVER);
dslContext.select(DSL.cast(field, SQLDataType.VARCHAR.length(255)));

командата select премахва информацията за дължината на varchar. Методът DSL.cast() връща cast("fieldName" as varchar(255)), а select връща select cast("fieldName" as varchar).

Проблемът е, че в SQLServer прехвърлянето без информация за дължина изрязва резултата след 30 знака, което е описано тук. Това е много неприятно, защото стойностите ми са с повече от 30 знака. Така че някой има ли идея как мога да получа оператор за избор, който изглежда така select cast("fieldName" as varchar(255))?


person Simone    schedule 18.05.2015    source източник
comment
Каква версия на jOOQ използвате?   -  person Lukas Eder    schedule 18.05.2015
comment
Използвам jooq-codegen-maven 3.0.0.   -  person Simone    schedule 19.05.2015
comment
Свързан въпрос: stackoverflow.com/questions/18401667/   -  person Lukas Eder    schedule 19.05.2015


Отговори (1)


Информацията за дължина, прецизност и мащаб на DataType беше въведена само в jOOQ 3.0, въпреки че тази информация не е била използвана в CAST() изрази до jOOQ 3.2 (проблем #2708 ):

Най-новата версия на jOOQ изобразява правилно

cast([fieldName] as varchar(255))

Така че предлагам да надстроите до най-новата версия.

Освен това, ако вашата версия/използване генерира cast("fieldName" as varchar), подозирам, че може да предавате и грешен SQLDialect (вместо SQLSERVER). При диалекта SQLSERVER идентификаторите се генерират с помощта на [brackets], за разлика от други диалекти, които използват "double quotes" за идентификатори...

person Lukas Eder    schedule 19.05.2015
comment
Благодаря. Прав си, това е синтаксисът за SQLServer, който използва скоби. Опитах различни диалекти - които всички се държат еднакво - така че обърках примера. - person Simone; 20.05.2015
comment
@Simone: Добре, просто исках да съм сигурен за диалекта :) И така, свърши ли работа надстройката? - person Lukas Eder; 20.05.2015
comment
да Между другото, как се държат cast изразите в concat изрази, ако полето има varchar с дължина? Нещо като това ‹code›DSL.concat(DELIM, table.val)‹/code› - person Simone; 20.05.2015
comment
@Simone: Хм, къде е актьорският състав в този пример? между другото: можете да използвате обратни отметки като ` code `, за да разграничите кода в Stack Overflow :) - person Lukas Eder; 20.05.2015
comment
Нещо като това Field‹String› DELIM = inline(\); DSL.concat(DELIM, table.val, DELIM); където table.val е от тип VARCHAR(4000)? Преобразува ли се table.val, защото е от тип VARCHAR(4000), а не от тип VARCHAR? - person Simone; 20.05.2015
comment
@Simone: Не, не трябва да има автоматично преобразуване поради DSL.concat(), когато го използвате по този начин... Въпреки това може да има прехвърляния, когато предавате стойности, които не са String, към concat(). Срещнахте ли някакъв конкретен проблем? - person Lukas Eder; 20.05.2015
comment
Пробвах го с версия 3.0.0. и table.val е прехвърлен. Не знам как се държи в по-новите версии. - person Simone; 20.05.2015