私は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;
}
}