public ArrayList<String> findLocationOfXMLDocumentsWithSkills(ArrayList<String> skillsToFind){
TreeMap<Integer, ArrayList<String>> fileLocationToNumberOfHits = new TreeMap<Integer, ArrayList<String>>();
def sql = Sql.newInstance(/jdbc:sqlite:C:\Users\pdfFileSystem.db/, "org.sqlite.JDBC")
sql.execute('CREATE TABLE IF NOT EXISTS skillList(SKILL TEXT NOT NULL, xmlFile0 TEXT, xmlFile1 TEXT, xmlFile2 TEXT)')
fileLocationToNumberOfHits.put(1, new ArrayList<String>());
for(String skill: skillsToFind){
skill = skill.toUpperCase();
def query = 'SELECT * FROM skillList WHERE SKILL="' + skill + '"'
println query
sql.eachRow(query) { row ->
...
}
...
}
...
}
Итак, это код, который я пытаюсь запустить с помощью Grails.
Для всех, кроме последней итерации цикла for, запрос println будет печатать "ELECT * FROM skillList WHERE SKILL ="{skill}
где {skill} заменяется любым навыком.
Почему он заменяет первый символ строки "
вместо того, чтобы добавлять ее в конец строки?
У меня есть тот же самый фрагмент кода, который выполняется в других функциях этого же класса, и он работает точно так, как должен.
Кто-нибудь знает что происходит?
Это как-то связано с функцией split, которую я использовал для создания навыковToFind.
Я использовал.split('\n') для строки, сгенерированной из textArea на моем сайте. Результирующие строки имели дополнительный характер в конце строки (за исключением последнего, поскольку он не был разделен на).
Я просто удалил этого персонажа из строки, и теперь все работает.
Спасибо всем за вашу помощь!
Заменить:
def query = 'SELECT * FROM skillList WHERE SKILL="' + skill + '"'
для:
def query = "SELECT * FROM skillList WHERE SKILL='$skill'"
Подробнее о Строках и GStrings в groovy: http://groovy.codehaus.org/Strings+and+GString
sql.eachRow("SELECT * FROM skillList WHERE SKILL=$skill") {
так что вы не открываете себя для инъекций sql?