Условие построения с датой для безопасного типа запроса jpa2 - PullRequest
0 голосов
/ 13 июля 2011

У меня следующий запрос:

SELECT DISTINCT * 
FROM Projekt p
WHERE p.bewilligungsdatum = to_date('01-07-2000', 'dd-mm-yyyy')

но у меня проблемы с созданием условий. Вот мой код:

condition = criteriaBuilder.equal((Expression<String>) projekt.get(criterion), "to_date('" + projektSearchField + "', 'dd-mm-yyyy')");

это генерирует следующее:

SELECT  DISTINCT * 
FROM Projekt p 
WHERE p.bewilligungsdatum = 'to_date('01-07-2000', 'dd-mm-yyyy')'

и ufcorse не работает. Какой метод следует использовать для сравнения дат (или как удалить внешние символы ' в части шаблона)?

Ответы [ 4 ]

0 голосов
/ 20 февраля 2019

вы можете использовать https://openhms.sourceforge.io/sqlbuilder/, затем использовать Условие, например


Object value1 = hire_date
Object value2 = new CustomObj("to_date('2018-12-01 00:00:00','yyyy-MM-dd HH:mm:ss')")

//CustomObj 
public class CustomObj extends Expression {
    private Object _value;

    public CustomObj(Object value) {
        _value = value;
    }

    @Override
    public boolean hasParens() {
        return false;
    }

    @Override
    protected void collectSchemaObjects(ValidationContext vContext) {
    }

    @Override
    public void appendTo(AppendableExt app) throws IOException {
        app.append(_value);
    }
}

BinaryCondition.greaterThan (значение1, значение2 включительно);

sql вроде hire_date> =to_date ('2011-02-28 00:00:00', 'гггг-мм-дд чч: мм: сс'))

0 голосов
/ 13 июля 2011

Это также должно работать, передавая дату в качестве параметра ограничения

Date datum; // initialized somewhere

CriteriaQuery query = ...

query.add(Restrictions.eq( "bewilligungsdatum ", datum );

...
0 голосов
/ 13 июля 2011

Извините.Я имел в виду спящий режим CriteriaQuery.

Затем попробуйте через что-то подобное CriteriaBuilder

Date datum; // initialized somewhere

...

final CriteriaQuery<Projekt> query = criteriaBuilder.createQuery(Projekt.class);
final Root<Projekt> projekt = query.from(Projekt.class);

Predicate condition = criteriaBuilder.equals(projekt.get("bewilligungsdatum"),datum);
query.where(condition)

Я не использовал это раньше, поэтому попробуйте самостоятельно

0 голосов
/ 13 июля 2011

почему бы вам не попробовать работать с такими параметрами?Затем вы можете выполнить преобразование String-> Date в java и передать действительное значение java.util.Date в базу данных.

EntityManager em; // initialized somewhere
Date datum; // initialized somewhere

...

String queryString = "SELECT p " 
             + "FROM Projekt p"
             + "WHERE p.bewilligungsdatum = :datum";

Query query = em.createQuery(queryString)

query.setParameter("datum", datum);

List<Projekt> projekte = query.getResultList();

Это способ сохранить независимость от БД, поскольку вы не используете конкретный to_dateфункция

viele Grüße aus Bremen; o)

...