2

私は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 のうち 2 つ (既に順序付けされている) が同じ順序付けを共有している場合、結果List<B>も合計で順序付けされ、互いに積み上げられた 2 つの順序付けられたリストが含まれないようにする必要があります。

どうすればそれを行うことができますか?これは私が知っていることです:

  • Field検索するフィールドを指定するオブジェクト。これは、SQL データベース内のテーブル内の列への直接参照です。
  • Orderオブジェクト_

だから私は(私の現在の実装では)、列(したがってフィールド)は次の値を持つことができると考えています:

  • 文字列 (SQL varchar 内)
  • 整数 (SQL int)
  • 日付 (SQL 日時)
  • BigInteger (SQL 10 進数)

また、順序は昇順または降順になります。

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;
    }
}
4

1 に答える 1

0

抽象クラスが必要だと思います。つまり、さまざまなタイプのフィールドごとにサブクラスを作成します。

public abstract class Field implements Comparable<Field> {

public abstract String getFieldName();

public int compareTo(Field field) {
return 0;
}
}
于 2013-07-22T13:39:51.977 に答える