【发布时间】:2016-08-17 11:19:41
【问题描述】:
我正忙于开发一个 SQL 查询构建器实用程序,它可以让我轻松快速地编写 SQL 查询。我已经为实际的查询构建器排序了基础知识,但是在数据库实体(即表和列)的字符串文字/常量上使用某种形式时,我被困住了。 我想做这样的事情:
String sqlQuery = queryBuilder.select(Tables.Users.FirstName)
.where(Tables.Users.Age >= 10)
.build()
.toString();
我已经阅读了很多关于枚举以及如何嵌套它们的内容,但似乎我必须为每个表(每个表都包含特定列)创建一个枚举。如果可能的话,我希望有一个类,其中包含所有表和每个表的所有列。 这应该允许我通过简单地调用类似的东西来“构建”一个字符串文字:
Tables.Address (returns the string value for 'address' table)
Tables.Address.Country (returns the string value for 'country' column)
这是我迄今为止使用枚举尝试过的,但不是我想要的。
public enum Table {
Users("users"),
Addresses("addresses"),
private String tableName;
Table(String tableName) {
this.tableName = tableName;
}
public String getName() {
return tableName;
}
}
public enum Column {
ID(Table.Users, "id"),
NAME(Table.Users, "name");
private Table table;
private String columnName;
Column(Table table, String columnName) {
this.table = table;
this.columnName = columnName;
}
public String getColumnName() {
return columnName;
}
}
【问题讨论】:
-
基本上,在编译时不应该知道表。因此,任何形式的常量都不适用。
-
您可能想在此处提供有关您尝试使用的数据库类型的更多信息。元数据绝对是要走的路,但是随着数据库供应商的变化,获取元数据的方式会有很大差异。
-
如果是关系数据库则不会。 Java JDBC 让您可以不受供应商限制地访问数据库元数据。
-
JPA、eclipseLink(标准生成器、模式类的生成器)、JOOQ 和其他人都这样做。看看,也许你可以做得更好,比如用 java 8 手段。部分是字节码分析,将编译后的代码
x < y等转换为符号表示法。 (NetBeans 有一个不错的 JPA、eclipseLink、集成。) -
@GrahamNicol:我正在使用 SQLlite。我将研究元数据以及如何使用它。谢谢
标签: java enums constants string-literals