0

以下の方法を使用してランダムな列を生成しようとしています。列を生成した後、SELECT sql.

final String columnsList = getColumns(table.getColumns());
final String selectSql = "SELECT ID, CREATION_DATE, LAST_MODIFIED_DATE, " + columnsList + "  from " + table.getTableName() + " where id = ?";

/**
 * A simple method to get the column names in the order in which it was
 * inserted
 * 
 * @param columns
 * @return
 */
private String getColumns(final List<String> columns) {
    List<String> copy = new ArrayList<String>(columns);
    Collections.shuffle(copy);

    int rNumber = random.nextInt(columns.size());

    List<String> subList = copy.subList(0, rNumber);
    Collections.sort(subList, new Comparator<String>() {

        @Override
        public int compare(String o1, String o2) {
            return columns.indexOf(o1) < columns.indexOf(o2) ? -1 : 1;
        }
    });
    return StringUtils.join(subList, ",");
}

問題文:-

columnsList値が空で、空の場合は前selectSqlに余分があるため機能しないことがあります。毎回少なくとも 1 つのエントリを返すようにするにはどうすればよいですか。,from keywordgetColumns

nextIntの間に乱数が生成されると思います0 (inclusively) and n (exclusively)。そのため、時々 0 を選択する可能性があります。1(inclusively) and n (exclusively)

4

1 に答える 1

1

1つの方法は次のとおりです。

return subList.isEmpty() ? "1" : StringUtils.join(subList, ",");

selectSqlしかし、私はより良いと思います

final String selectSql = "SELECT ID, CREATION_DATE, LAST_MODIFIED_DATE " + columnsList + "  from " + table.getTableName() + " where id = ?";

その後

return subList.isEmpty() ? "" : ","+StringUtils.join(subList, ",");

ランダムから少なくとも1つの値が必要な場合は、これを使用することもできます。

int rNumber = 1+random.nextInt(columns.size()-1);
于 2013-03-01T20:15:15.717 に答える