我想在java中使用集合而不是数组来序列化postgreSQL数组。例如INT[]、varchar(256)[]到java集合和Collection。
public class PostgresArrayBinding implements Binding<Object, Collection> {
@Override
public Converter<Object, Collection> converter() {
return new Converter<Object, Collection>() {
@Override
public Collection from(final Object dbObj) {
return dbObj == null ? null : new ArrayList<>(Arrays.asList((Object[])dbObj));
}
@Override
public Object to(final Collection userObject) {
return userObject == null ? null : "ARRAY[" + Joiner.on(',').join(userObject) + "]";
}
@Override
public Class<Object> fromType() {
return Object.class;
}
@Override
public Class<Collection> toType() {
return Collection.class;
}
};
}
@Override
public void sql(final BindingSQLContext<Collection> ctx) throws SQLException {
ctx.render().visit(DSL.val(ctx.convert(converter()).value())).sql("::ARRAY");
}
@Override
public void register(final BindingRegisterContext<Collection> ctx) throws SQLException {
ctx.statement().registerOutParameter(ctx.index(), Types.ARRAY);
}
@Override
public void set(final BindingSetStatementContext<Collection> ctx) throws SQLException {
ctx.statement().setString(ctx.index(), Objects.toString(ctx.convert(converter()).value(), null));
}
@Override
public void set(final BindingSetSQLOutputContext<Collection> ctx) throws SQLException {
throw new SQLFeatureNotSupportedException();
}
@Override
public void get(final BindingGetResultSetContext<Collection> ctx) throws SQLException {
ctx.convert(converter()).value(ctx.resultSet().getString(ctx.index()));
}
@Override
public void get(final BindingGetStatementContext<Collection> ctx) throws SQLException {
ctx.convert(converter()).value(ctx.statement().getString(ctx.index()));
}
@Override
public void get(final BindingGetSQLInputContext<Collection> ctx) throws SQLException {
throw new SQLFeatureNotSupportedException();
}
}
<configuration>
...
<generator>
<database>
<name>org.jooq.util.postgres.PostgresDatabase</name>
<includes>.*</includes>
<excludes>schema_version</excludes>
<inputSchema>public</inputSchema>
<customTypes>
...
<customType>
<name>ARRAY</name>
<type>java.util.Collection</type>
<binding>ru.fabit.contingent.configuration.persistence.PostgresArrayBinding</binding>
</customType>
</customTypes>
<forcedTypes>
...
<forcedType>
<name>ARRAY</name>
<expression>.*_ARRAY</expression>
<types>.*</types>
</forcedType>
</forcedTypes>
</database>
<generate>
<records>true</records>
<interfaces>true</interfaces>
<relations>true</relations>
<validationAnnotations>true</validationAnnotations>
</generate>
<target>
<packageName>ru.fabit.contingent.models.generated</packageName>
<directory>src/main/java/</directory>
</target>
</generator>
</configuration>
SQL:
创建表array_tests(string_array varchar(256)[]);
我在生成的类中出错:
public final TableField<ArrayTestsRecord, Collection[]> STRING_ARRAY = createField("string_array", org.jooq.impl.DefaultDataType.getDefaultDataType("java.util.Collection").getArrayDataType(), this, "", new PostgresArrayBinding());
这是由于代码生成器中的一个bug,该bug在jOOQ 3.8中得到了修复:https://github.com/jOOQ/jOOQ/issues/4388
对于Jooq3.7或更低版本,除了手动修补错误生成的代码之外,恐怕没有任何解决办法。
主要内容:之前的旧方法,Java11 的 新方法,Java11 集合转换为数组 的示例Java 11 引入了一种将集合转换为数组的简单方法。 之前的旧方法 Java11 的 新方法 Java11 集合转换为数组 的示例 ApiTester.java 输出结果为
我想显示一个图形,为了显示它,我需要整数值。我从我的代码中得到这个 有没有什么方法可以让我以这样一种方式转换集合以获得整数值?我在打印集合c时得到这个
现有两个名为getDetails(…)的方法 。一个需要至少一个必需参数,另一个需要一个集合(不验证集合的内容/大小)。 问题是集合有时会作为空传递,并且根据我的业务案例,我总是期望至少传递一个值。因此,我需要将该方法设为私有,它接受集合。 我计划将下面的方法作用域设置为private,这样调用者就不会使用零属性调用此方法。 调用方方法之一是将集合对象传递给下面的getDetails, id.ge
运行代码时,出现以下错误: 导致的代码是: 但当我这样做时: 我得到以下输出: [1,7,15] 我不明白为什么我不能将其转换为整数[]。有什么建议吗?
我想在Scala中映射Java数组。对于普通的Java集合,我知道我可以使用 但是,对于阵列,此转换不起作用: 那么,如何将Java数组转换为Scala集合、iterable或可以映射的对象呢?