我有以下使用sqlite3和java的代码,它们运行无误:
public class SqLiteDB {
public static void main(final String[] args) {
final SqLiteDB theDatabase = SqLiteDB.initSqLiteDB();
theDatabase.addParametersRow("test", "beam process");
theDatabase.addParametersRow("test", "beam process 1");
theDatabase.addParametersRow("test", "beam process 2");
theDatabase.addParametersRow("test1", "beam process 1");
theDatabase.addParametersRow("test1", "beam process 2");
theDatabase.addParametersRow("test2", "beam process");
theDatabase.addParametersRow("test2", "beam process 1");
theDatabase.addParametersRow("test3", "beam process");
theDatabase.addGroupStatements();
for (final Entry<String, String> result : theDatabase.getParametersAll().entrySet()) {
System.out.print(result.getKey() + ", " + result.getValue() + "\n");
}
}
private static final Logger LOGGER = LoggerFactory.getLogger(SqLiteDB.class);
private Connection dbConnection = null;
private static SqLiteDB myInstance = null;
// *****************************************************************************************************************
// Public methods
// *****************************************************************************************************************
public static SqLiteDB initSqLiteDB() {
if (myInstance == null) {
myInstance = new SqLiteDB();
}
return myInstance;
}
public void addParametersRow(final String parameterName, final String beamProcessName) {
final String sqlInsert = "INSERT INTO PARAMETERS (PARAMETER_NAME, BEAM_PROCESS) VALUES ('" + parameterName
+ "', '" + beamProcessName + "');";
try (Statement insertStatement = dbConnection.createStatement()) {
insertStatement.execute(sqlInsert);
} catch (final SQLException ex) {
ErrorLogger.logError(ex.getStackTrace(), ex);
}
}
public Map<String, String> getParametersAll() {
final String sqlGetParameterCount = "SELECT * FROM PARAMETERS";
final Map<String, String> queryResults = new TreeMap<>();
try (Statement queryParameterCount = dbConnection.createStatement()) {
final ResultSet resultSet = queryParameterCount.executeQuery(sqlGetParameterCount);
getClass();
while (resultSet.next()) {
queryResults.put(resultSet.getString(1), resultSet.getString(2));
}
resultSet.close();
} catch (final SQLException ex) {
ErrorLogger.logError(ex.getStackTrace(), ex);
}
return queryResults;
}
// *****************************************************************************************************************
// Private methods
// *****************************************************************************************************************
private SqLiteDB() {
try {
dbConnection = DriverManager.getConnection("jdbc:sqlite::memory:");
} catch (final SQLException ex) {
ErrorLogger.logError(ex.getStackTrace(), ex);
}
createTableAvailableParameters();
}
private void createTableAvailableParameters() {
if (dbConnection != null) {
final String sqlCreateTable = "CREATE TABLE IF NOT EXISTS PARAMETERS (\n"
+ " PARAMETER_NAME text NOT NULL, BEAM_PROCESS text NOT NULL, PRIMARY KEY (PARAMETER_NAME, BEAM_PROCESS));";
try (final Statement statement = dbConnection.createStatement()) {
statement.execute(sqlCreateTable);
} catch (final SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
private void addGroupStatements() {
final String sqlGetParameterCount = "SELECT PARAMETER_NAME, COUNT(PARAMETER_NAME) FROM PARAMETERS GROUP BY PARAMETER_NAME HAVING COUNT(PARAMETER_NAME) > 1";
final Map<String, Integer> queryResults = new HashMap<>();
try (Statement queryParameterCount = dbConnection.createStatement()) {
final ResultSet resultSet = queryParameterCount.executeQuery(sqlGetParameterCount);
getClass();
while (resultSet.next()) {
queryResults.put(resultSet.getString(1), resultSet.getInt(2));
}
resultSet.close();
} catch (final SQLException ex) {
ErrorLogger.logError(ex.getStackTrace(), ex);
}
for (final Entry<String, Integer> resultRow : queryResults.entrySet()) {
if (resultRow.getValue() > 1) {
addParametersRow(resultRow.getKey(), "*");
}
}
}
}
当我运行代码时,它将产生以下输出:
test, *
test1, *
test2, *
test3, beam process
我不知道我的“ test(1,2),beam process(1,2)”行在哪里?他们为什么/在哪里迷路?
Stackoverflow不接受带有大量代码的发布。我不知道如何截断代码而不忽略可能需要的细节。这就是为什么我不得不添加一些更无用的文本的原因。我希望这可以使这个问题可以发表。
损失发生在函数中getParametersAll()
。在此功能中,您遍历可用结果并将其添加到地图中。但是,如果出现重复的值,则将覆盖映射中已读取的结果。因此,您仅会为每个参数获得最后创建的光束过程。
解决此问题的一种方法是创建一个Map<String, List<String>>
地图,然后返回此地图。
Map<String, List<String>> queryResults = new TreeMap<>();
while (resultSet.next()) {
if (!queryResults.contains(resultSet.getString(1)) {
queryResults.put(resultSet.getString(1), new ArrayList<>());
}
queryResults.get(resultSet.getString(1)).add(resultSet.getString(2));
}
希望这能回答您的问题,否则我可能误解了您的问题。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句