如何解决JOOQ:如何最好地多态访问列? 将API添加到生成的代码中使用可嵌入类型
我们的情况与this question非常相似。我们有可删除的表,这意味着它们还有一组与删除相关的列,例如“ DELETED”,“ DELETED_BY”等。现在我们要做的是:
dsl.select()
.from(CUSTOMER)
.where(createDeletedCondition(CUSTOMER,currentUserId))
createDeletedCondition
是可以应用于所有可删除表的方法:
public static Condidtion createDeletedCondition(final IDeletableTable deletableTable,final UUID currentUserId) {
return deletableTable.DELETED.isTrue().and(deletableTable.DELETED_BY.eq(currentUserId));
}
现在,我们通过显式命名字段(deletableTable.getField("deleted_by")
)来访问这些字段,这似乎很尴尬,并且在重构时并不安全。也许有更好的方法可以做到这一点?
解决方法
将API添加到生成的代码中
该问题与one you've linked略有不同,因为另一个问题打算将内容添加到生成的记录中,而您的问题想将内容添加到生成的表中>。但是机制是相同的。您可以定义一个接口:
public interface IDeletableTable {
Field<Boolean> DELETED();
Field<UUID> DELETED_BY();
}
然后,扩展生成的代码
一个配置示例:
..
<generator>
<strategy>
<matchers>
<tables>
<table>
<expression>MY_TABLE</expression>
<tableImplements>com.example.IDeletableTable</tableImplements>
</table>
</tables>
</matchers>
</strategy>
</generator>
然后提供the custom code section来实现该接口:
// A programmatic
public class MyJavaGenerator extends JavaGenerator {
@Override
public void generateTableClassFooter(TableDefinition table,JavaWriter out) {
// Repeat the generator strategy's expression:
if (table.getInputName().matches("MY_TABLE")) {
// Take inspiration for these things from JavaGenerator::generateTable
// It's also possible to hardcode things or otherwise avoid internal codegen
// API. For example,out.ref() is only used to generate an import for types,// which may already be imported.
String columnTypeFull = getJavaType(column.getType(resolver()));
String columnType = out.ref(columnTypeFull);
String columnId = out.ref(getStrategy().getJavaIdentifier(column),3);
out.javadoc("...");
out.override();
out.println("public %s<%s> %s() {",Field.class,columnType,columnId);
out.println(" return %s;");
out.println("}");
}
}
}
上面的代码使用了jOOQ 3.14中提供的一些格式化工具,以简化缩进。您当然可以手动缩进。
使用可嵌入类型
一段时间以来,jOOQ拥有一个未记录的(和可移动的目标)功能,称为可嵌入类型,这很有可能在即将到来的jOOQ 3.14中完成:
使用可嵌入类型,您可以提取一种将两个字段包装在一个复合字段中的新数据类型(类似于JPA的@Embeddable
类型),并允许在表之间重用共享数据类型。这样,您可以简单地绕过表的TableField<DeletionInfo>
,而不必考虑可嵌入类型所在的表。
功能在3.14中稳定后,我将更新此答案。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。