Java 根据列在ArrayList中的顺序生成SQL

Java 根据列在ArrayList中的顺序生成SQL,java,sql,random,Java,Sql,Random,我有一个名为TableConnectionInfo的类,它包含有关表的详细信息,例如tableName及其列。我编写了一个方法,其中我应该使用每个表的table.getColumns()方法中的列值生成一个随机选择sql 假设表1有10列,如- col1 col2 col3 col4 col5 col6 col7 col8 col9 col10 下面是我尝试使用表.getColumns()生成随机选择sql的方法。这里的table是TableConnectionInfo对象 private s

我有一个名为
TableConnectionInfo
的类,它包含有关表的详细信息,例如
tableName
及其
列。我编写了一个方法,其中我应该使用每个表的
table.getColumns()
方法中的列值生成一个随机选择sql

假设表1有10列,如-

col1
col2
col3
col4
col5
col6
col7
col8
col9
col10
下面是我尝试使用
表.getColumns()
生成随机选择sql的方法。这里的
table
TableConnectionInfo
对象

private static Random random = new SecureRandom();

private String generateRandomSQL(TableConnectionInfo table) {

    int rNumber = random.nextInt(table.getColumns().size());

    List<String> shuffledColumns = new ArrayList<String>(table.getColumns());
    Collections.shuffle(shuffledColumns);

    String columnsList = "";

    for (int i = 0; i < rNumber; i++) {
        columnsList += ("," + shuffledColumns.get(i));
    }

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

    return sql;
}
问题陈述:-

所以上述方法的问题是,它将以随机方式洗牌所有列,我将得到如下结果-

`SELECT ID, CREATION_DATE, LAST_MODIFIED_DATE, col3, col1, col5 from table1 where id = ?`
`SELECT ID, CREATION_DATE, LAST_MODIFIED_DATE, col7, col2, col3, col1 from table1 where id = ?`
`SELECT ID, CREATION_DATE, LAST_MODIFIED_DATE, col8, col1, col2, col6 from table1 where id = ?`
... Other possible combinations
我在找这样的东西。在ArrayList中插入列的方式-假设这是顺序-

col1、col2、col3、col4、col5、col6、col7、col8、col9、col10

那么my
SELECT SQL
中的列的顺序应该相同。意义-

`SELECT ID, CREATION_DATE, LAST_MODIFIED_DATE, col1, col3, col5 from table1 where id = ?`
`SELECT ID, CREATION_DATE, LAST_MODIFIED_DATE, col7, col8, col9, col10 from table1 where id = ?`
`SELECT ID, CREATION_DATE, LAST_MODIFIED_DATE, col1, col4, col5, col6, col10 from table1 where id = ?`
它不应该是随机的,比如
col1
,然后
col5
,然后
col2
(这是错误的)。应该是-

col5, col7, col10
col3, col6, col8, col10

other options

基本上,我希望SELECT sql中的列与ArrayList中插入列的方式相同,但顺序是随机的。Like-按插入顺序选择任意4个,或按插入顺序选择任意6个,或按插入顺序选择任意7个解决方案如下

private static 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, ",");
}
private静态字符串getColumns(最终列表列){
列表副本=新的ArrayList(列);
收藏。洗牌(复制);
int rNumber=random.nextInt(columns.size());
列表子列表=复制。子列表(0,r编号);
Collections.sort(子列表,新比较器(){
@凌驾
公共整数比较(字符串o1、字符串o2){
返回列.indexOf(o1)<列.indexOf(o2)?-1:1;
}
});
返回StringUtils.join(子列表,“”,“”);
}

我使用的是from

您希望它们是按数组列表中的顺序排列还是按随机顺序排列?如果您希望它们按定义的顺序排列,为什么要洗牌列集合?@MattBusche,我希望它们是按数组列表中的顺序排列,但是按随机顺序排列。假设
col1
col2
col3
col4
是我的数组列表中的顺序。然后我需要这样的东西-
col1,col4
col2,col3
,但不是
col4,col1
col3,col1
@Perception,我这样做是因为我在做LnP测试,所以我们试图复制我们即将期望的生产场景。这就是我打算这样做的原因。创建一个新的列表p,其中包含列数组中的项。2.洗牌。3.从第4页创建rNumber项的子列表。使用列数组的排序顺序对其进行排序。
private static 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, ",");
}