【发布时间】:2016-01-21 12:01:14
【问题描述】:
我想将 MySQL 类型 SET 与 jOOQ 代码生成一起使用,简而言之,它类似于 MySQL ENUM,但具有多个值。
我已经尝试过,但我认为泛型类型擦除通过当前的Converter 实现防止了这种情况。也许一些使用TypeToken 的ConverterType 可以解决这个问题。类似于it's used on the Gson library。
让我们使用这个示例数据库:
CREATE TABLE sometable (
id int(11) NOT NULL PRIMARY_KEY AUTO_INCREMENT,
availability set('MONDAY','TUESDAY','WEDNESDAY','THURSDAY','FRIDAY','SATURDAY','SUNDAY')
COLLATE utf8_spanish_ci NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_spanish_ci;
代码生成器 XML 可能是这个:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<configuration>
<!-- Configure the database connection here -->
<jdbc>
<driver>org.gjt.mm.mysql.Driver</driver>
<url>jdbc:mysql://192.168.1.x/test</url>
<user>xxxx</user>
<password>xxxx</password>
</jdbc>
<generator>
<database>
<name>org.jooq.util.mysql.MySQLDatabase</name>
<inputSchema>test</inputSchema>
<customTypes>
<customType>
<name>DayOfWeek</name>
<type>java.time.DayOfWeek</type>
<converter>sargue.DayOfWeekConverter</converter>
</customType>
</customTypes>
<forcedTypes>
<forcedType>
<name>DayOfWeek</name>
<expression>day</expression>
</forcedType>
</forcedTypes>
</database>
<generate>
<deprecated>false</deprecated>
</generate>
<target>
<packageName>jooq</packageName>
<directory>src/main/java</directory>
</target>
</generator>
</configuration>
所以现在我需要一个转换器。
package sargue;
import org.jooq.Converter;
import java.time.DayOfWeek;
import java.util.EnumSet;
public class DayOfWeekConverter implements Converter<String, EnumSet<DayOfWeek>>{
@Override
public EnumSet<DayOfWeek> from(String databaseObject) {
if (databaseObject == null) return null;
EnumSet<DayOfWeek> enumSet = EnumSet.noneOf(DayOfWeek.class);
for (String s : databaseObject.split(","))
if (!s.isEmpty())
enumSet.add(DayOfWeek.valueOf(s));
return enumSet;
}
@Override
public String to(EnumSet<DayOfWeek> userObject) {
if (userObject == null) return null;
return userObject.stream().map(Enum::toString).collect(Collectors.joining(","));
}
@Override
public Class<String> fromType() {
return String.class;
}
@Override
public Class<EnumSet<DayOfWeek>> toType() {
// This doesn't work... we need something to circunvent type erasure
// some sort of TypeToken as in other libraries
return new EnumSet<DayOfWeek>().getClass();
}
}
我想我可以为 EnumSet 编写一个转换器,但我会丢失封闭的类型,所以它没用。或者也许我错了,它可以做到!
可以吗?
【问题讨论】:
标签: java mysql generics enums jooq