我正在开发一个ORM系统(对象关系映射,基本上是java类中的包装器,所以我不需要直接使用SQL代码)
这个问题涉及通过规范约束在表格中搜索:
public final List<B> search(final AbstractConstraint... c) throws SearchException {
if (c.length == 0) {
throw new IllegalArgumentException("orm.Manager.search: c.length == 0");
}
try {
List<B> beans = new ArrayList<>();
for (AbstractConstraint constraint : c) {
try (PreparedStatement ps = new QueryBuilder(connection, tableName(), getPaths(), searchQuery()).add(constraint).build();
ResultSet rs = ps.executeQuery()) {
while (rs.next()) {
beans.add(createBean(rs));
}
}
}
if (c.length > 1) {
boolean sorting = true;
Field field = c[0].getField();
Order order = c[0].getOrder();
for (int i = 1; i < c.length; i++) {
Field currentField = c[i].getField();
Order currentOrder = c[i].getOrder();
if (!field.equals(currentField) || !order.equals(currentOrder)) {
sorting = false;
break;
}
}
if (sorting) {
//sort on field with comparator of supertype
}
}
return beans;
} catch (SQLException ex) {
Logger.getLogger(Manager.class.getName()).log(Level.SEVERE, null, ex);
throw new SearchException(ex);
}
}
通常,AbstractConstraint本身会处理顺序。但是如果您使用多个AbstractConstraints(基本上是我的SQL OR
的对应物),则会有一个特殊情况。如果其中两个单独的AbstractConstraints(已经订购)共享相同的顺序,则生成的List<B>
也应该总计也是有序的,并且不包含堆叠在彼此顶部的两个有序列表。
我该怎么做呢?这就是我所知道的:
Field
对象,指定应搜索哪个字段,这是对SQL数据库中表的列的直接引用。Order
对象所以我在想(在我当前的实现中),列(因此字段)可以具有以下值:
排序将是升序或降序。
我如何扩展Field
类以捕获列的类型?这就是Field目前的所有内容:
public interface Field {
public String getFieldName();
}
我怎么写Comparator
?实际上,我是否必须写Comparator
或者是否应该Field
以某种方式实施Comparable
?
我希望这个问题是可以理解的,并期待任何回应。
编辑:添加Field
的具体实施示例:
public enum InvoiceFields implements Field {
invoiceId("invoices.invoiceId"),
businessPartnerId("invoices.businessPartnerId"),
invoiceNumber("invoices.invoiceNumber"),
invoiceDate("invoices.invoiceDate"),
priceExclVAT("invoices.priceExclVAT"),
VAT("invoices.VAT"),
priceInclVAT("invoices.priceInclVAT"),
paymentDiscount("invoices.paymentDiscount"),
status("invoices.status");
private final String enumName;
private InvoiceFields(final String enumName) {
this.enumName = enumName;
}
@Override
public String getFieldName() {
return enumName;
}
}
答案 0 :(得分:0)
我认为你想要一个抽象类。然后为每个不同类型的字段创建子类。
public abstract class Field implements Comparable<Field> {
public abstract String getFieldName();
public int compareTo(Field field) {
return 0;
}
}