2013-05-21 111 views
1

我的应用程序在我包含自定义类型转换器之前工作正常。我需要将jOOQ UInteger转换为Integer,所以我包含了一个类型转换器来实现这一点。发布此更改,我得到一个MySQL语法错误的限制和偏移量。jOOQ自定义问题类型转换

然后在调试时,我发现所有正在提供的Integer值(包括限制和偏移值)都转换为UInteger(由于类型转换器),并转而为字符串,因为UInteger不是默认类型。

我可以通过链接jooq issue with limit and offset提供的解决方案解决此问题,但我想了解一些细节。

  1. 如果我使用settings.setStatementType(StatementType.STATIC_STATEMENT)我不能得到事先准备好的声明,我可能会错过的PreparedStatement的优势。

  2. 如果我使用Factory.inline来绑定所有整数内联值,我必须对我的完整应用程序执行此操作,如果我错过了某些操作,会导致严重问题。

请帮助我解决问题或给我一些相同的建议。

+0

我觉得你在这个问题中混合了几件事:类型转换,绑定变量内联。你现在想解决什么样的问题? –

+0

我想使用不带绑定变量的内联类型转换。因为我不能绑定所有变量内联 – developer

+0

我仍然不太明白转换和变量绑定是如何相关的......这是关于试图避免一些转换?你面临的最初问题是什么? –

回答

0

我认为你正在寻找的是一种完全禁用无符号整数类型生成的方法。相关的代码生成标志被记录在这里:

http://www.jooq.org/doc/3.0/manual/code-generation/codegen-advanced

的摘录:

<!-- Generate jOOU data types for your unsigned data types, which are 
    not natively supported in Java. 
    Defaults to true --> 
<unsignedTypes>false</unsignedTypes> 

否则,有一个无证的解决方案来强制类型到另一种SQL类型,而不是在一个转换器。该文档的任务是这样的一个位置:

https://github.com/jOOQ/jOOQ/issues/2095

这不是很好的测试,但在转换的情况下UIntegerInteger之间可能工作得非常好。从集成测试的例子可以看出here

<forcedType> 
    <name>UUID</name> 
    <expressions>(?i:(.*?.)?T_EXOTIC_TYPES.UU)</expressions> 
</forcedType> 

你的情况:

<forcedType> 
    <name>INTEGER</name> 
    <expressions>YOUR_COLUMN_MATCHING_EXPRESSION_HERE</expressions> 
</forcedType> 

请注意,您可以将您的数据库架构随时更改,以实际持有签署的类型,而不是无符号的。

+0

是啊,这是我第一次尝试的,但我的老人不满意,因为它完全删除了无符号类型的概念。在某些情况下,我们需要无符号类型,而不是一些。这就是为什么我们选择了另一种称为自定义类型转换器的选项。 – developer

+0

如果现在是一个设计缺陷,我希望在不久的将来能够解决这个问题吗? – developer

+0

@Yuvaraj:如果某些列不需要“无符号”,那么为什么要在数据库中声明它们是无符号的?不幸的是,我无法给你任何关于何时解决“转换器问题”的保证,但请参阅最新解决方案的答案。 –