Arhn - архитектура программирования

Datanucleus + PostgreSQL не экранирует обратную косую черту

Я пытаюсь понять, где я ошибаюсь с запросом в Datanucleus (при поддержке базы данных Postgres). Кажется, что даже простые запросы терпят неудачу, если выражение содержит обратную косую черту. Однако у меня сложилось впечатление, что JDO/Datanucleus должен абстрагироваться от необходимости вручную экранировать параметры в запросе, как это делает PreparedStatement с чистым JDBC.

Вот самодостаточный пример:

package somepkg;

import org.datanucleus.api.jdo.JDOPersistenceManager;

import javax.jdo.*;
import javax.jdo.annotations.*;
import java.util.*;

@PersistenceCapable
public final class MyPersistentObject {

    @Persistent(valueStrategy = IdGeneratorStrategy.INCREMENT)
    @PrimaryKey
    private long id;

    @Persistent
    private String value;

    public MyPersistentObject(String value) {
        this.value = value;
    }

    public static void main(String... args) {
        JDOPersistenceManager pm = (JDOPersistenceManager)
                JDOHelper.getPersistenceManagerFactory(datanucleusProperties())
                        .getPersistenceManager();

        //seems to be a problem with values that contain a backspace
        String value = "\\";

        //store (works fine)
        Transaction tx = pm.currentTransaction();
        tx.begin();
        MyPersistentObject objectToStore = new MyPersistentObject(value);
        pm.makePersistent(objectToStore);
        tx.commit();

        //fetch (fails)
        MyPersistentObject fetchedObject = pm
                .newTypesafeQuery(MyPersistentObject.class)
                .filter(QMyPersistentObject.candidate().value.eq(value))
                .executeUnique();

        System.out.println(fetchedObject);
    }

    private static Map<String, String> datanucleusProperties() {
        Map<String, String> datanucleusProperties = new HashMap<String, String>();

        datanucleusProperties.put("javax.jdo.option.ConnectionDriverName", "org.postgresql.Driver");
        datanucleusProperties.put("javax.jdo.option.ConnectionURL", "jdbc:postgresql:test");
        datanucleusProperties.put("javax.jdo.option.ConnectionUserName", "postgres");
        datanucleusProperties.put("javax.jdo.option.ConnectionPassword", "");
        datanucleusProperties.put("datanucleus.autoCreateSchema", "true");
        datanucleusProperties.put("datanucleus.validateTables", "false");
        datanucleusProperties.put("datanucleus.validateConstraints", "false");
        return datanucleusProperties;
    }
}

QMyPersistentObject создается при запуске процессора аннотаций. Это не удается со следующим сообщением:

Exception in thread "main" javax.jdo.JDOException: Exception thrown when executing query
at org.datanucleus.api.jdo.NucleusJDOHelper.getJDOExceptionForNucleusException(NucleusJDOHelper.java:567)
at org.datanucleus.api.jdo.query.JDOTypesafeQuery.executeInternalQuery(JDOTypesafeQuery.java:946)
at org.datanucleus.api.jdo.query.JDOTypesafeQuery.executeUnique(JDOTypesafeQuery.java:770)
at somepkg.MyPersistentObject.main(MyPersistentObject.java:52)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:601)
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:120)
NestedThrowablesStackTrace:
org.postgresql.util.PSQLException: ERROR: unterminated quoted string at or near "'\'"
Position: 128
at org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:2102)
at org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:1835)
at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:257)
at org.postgresql.jdbc2.AbstractJdbc2Statement.execute(AbstractJdbc2Statement.java:500)
at org.postgresql.jdbc2.AbstractJdbc2Statement.executeWithFlags(AbstractJdbc2Statement.java:388)
at org.postgresql.jdbc2.AbstractJdbc2Statement.executeQuery(AbstractJdbc2Statement.java:273)
at org.datanucleus.store.rdbms.datasource.dbcp.DelegatingPreparedStatement.executeQuery(DelegatingPreparedStatement.java:96)
at org.datanucleus.store.rdbms.datasource.dbcp.DelegatingPreparedStatement.executeQuery(DelegatingPreparedStatement.java:96)
at org.datanucleus.store.rdbms.SQLController.executeStatementQuery(SQLController.java:465)
at org.datanucleus.store.rdbms.query.JDOQLQuery.performExecute(JDOQLQuery.java:625)
at org.datanucleus.store.query.Query.executeQuery(Query.java:1789)
at org.datanucleus.store.query.Query.executeWithArray(Query.java:1665)
at org.datanucleus.store.query.Query.execute(Query.java:1638)
at org.datanucleus.api.jdo.query.JDOTypesafeQuery.executeInternalQuery(JDOTypesafeQuery.java:936)
at org.datanucleus.api.jdo.query.JDOTypesafeQuery.executeUnique(JDOTypesafeQuery.java:770)
at somepkg.MyPersistentObject.main(MyPersistentObject.java:52)

Кто-нибудь знает достаточно о JDO или Datanucleus, чтобы знать, нужно ли мне предпринимать дополнительные шаги, чтобы избежать чего-то при запросе? Если нет (как я предполагаю), я полагаю, что это ошибка либо в Datanucleus, либо в драйвере JDBC Postgres?


Ответы:


1

Почему бы просто не поместить туда параметр (вместо жестко заданных значений и возникновения последующих проблем), а затем передать его драйверу JDBC как ?. то есть способ, которым JDBC всегда рекомендует обращаться с такими вещами

15.12.2011
  • Спасибо за ответ. Итак, вы говорите, что использование BooleanExpression не избавляет вас от литералов? Я бы подумал, что это то, о чем конечному разработчику не нужно беспокоиться, поскольку я не тот, кто создает SQL. Насколько я понимаю DN, мне не нужно много взаимодействовать с JDBC. Можете ли вы указать мне ресурс, который описывает то, о чем вы говорите? 15.12.2011
  • Если пользователь делает стандартный JDOQL SELECT FROM mydomain.MyClass WHERE field == + value; тогда они должны сами позаботиться о любых косых чертах и ​​т. д. То же самое относится и к безопасному типу JDOQL. Я нигде не говорил, что вы должны взаимодействовать с JDBC; Я имею в виду то, на что это переведено. Как сказано, используйте параметр в своем запросе; согласно спецификации JDO, документы DN 15.12.2011
  • Я думаю, что меня смущает то, что сейчас это кажется очень дырявой абстракцией. Postgres терпит неудачу из-за того, что я использую литерал в своем коде на уровне, которому даже не нужно знать, что Postgres используется. Я думаю, что узнал, как параметризовать запрос, так что спасибо, что указали мне в нужном направлении. Но я все еще не могу найти документацию, в которой говорится об этом. Видя, что вы, кажется, парень DataNucleus, я подумал, что вы могли бы направить меня к чему-то другому, кроме спецификации JDO, DN docs. 15.12.2011
  • Новые материалы

    Коллекции публикаций по глубокому обучению
    Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

    Представляем: Pepita
    Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

    Советы по коду Laravel #2
    1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

    Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
    Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

    3 способа решить квадратное уравнение (3-й мой любимый) -
    1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

    Создание VR-миров с A-Frame
    Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

    Демистификация рекурсии
    КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..