Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Java Новый топик    Ответить
Топик располагается на нескольких страницах: Ctrl  назад   1 2 3 4 5 6 7 [8] 9 10   вперед  Ctrl      все
 Re: Немного SQL перенести на хибер  [new]
mayton
Member

Откуда: loopback
Сообщений: 49763
Zzz79
вот такой селект делает все что мне надо - сначала дату в секунды UNIX потом все в текст
неплохо я вам скажу
SELECT me.email,CAST (pc.poll_id as text),CAST((select extract (epoch from me.unsubscribe_date)) as text)


щас посмотрим как это переварится в java коде

По поводу кастинга даты в текст. Здесь нигде не указывается формат даты. Это опасно. Если формат
не указан он может браться из настроек БД или далее по протоколу из настроек клиента или текущей сессии.

По крайней мере так в Оракле. Как в твоей DBMS я не знаю но в данном коде не хватает явного параметра
типа 'YYYY-MM-DD' как аргумента где-нибудь.
17 ноя 20, 15:11    [22233842]     Ответить | Цитировать Сообщить модератору
 Re: Немного SQL перенести на хибер  [new]
Zzz79
Member

Откуда:
Сообщений: 1005
PetroNotC Sharp
Zzz79
вот такой селект
вау. Ты почти sql прогер)))

а толку -джава послала меня нах с таким запросом
17 ноя 20, 15:24    [22233863]     Ответить | Цитировать Сообщить модератору
 Re: Немного SQL перенести на хибер  [new]
Zzz79
Member

Откуда:
Сообщений: 1005
mayton
Zzz79
вот такой селект делает все что мне надо - сначала дату в секунды UNIX потом все в текст
неплохо я вам скажу
SELECT me.email,CAST (pc.poll_id as text),CAST((select extract (epoch from me.unsubscribe_date)) as text)


щас посмотрим как это переварится в java коде

По поводу кастинга даты в текст. Здесь нигде не указывается формат даты. Это опасно. Если формат
не указан он может браться из настроек БД или далее по протоколу из настроек клиента или текущей сессии.

По крайней мере так в Оракле. Как в твоей DBMS я не знаю но в данном коде не хватает явного параметра
типа 'YYYY-MM-DD' как аргумента где-нибудь.

майтон стареешь) там же не дата а секунды
17 ноя 20, 15:25    [22233864]     Ответить | Цитировать Сообщить модератору
 Re: Немного SQL перенести на хибер  [new]
mayton
Member

Откуда: loopback
Сообщений: 49763
Ну тогда зачем целое число кастить в текст?
17 ноя 20, 15:33    [22233875]     Ответить | Цитировать Сообщить модератору
 Re: Немного SQL перенести на хибер  [new]
Zzz79
Member

Откуда:
Сообщений: 1005
mayton
Ну тогда зачем целое число кастить в текст?

потому что это не число а Unix timeStamp на выходе
17 ноя 20, 15:39    [22233881]     Ответить | Цитировать Сообщить модератору
 Re: Немного SQL перенести на хибер  [new]
mayton
Member

Откуда: loopback
Сообщений: 49763
Делай как хочешь. Просто мне кажется что часть преобразований в запросе не очень-то нужны.
17 ноя 20, 15:48    [22233894]     Ответить | Цитировать Сообщить модератору
 Re: Немного SQL перенести на хибер  [new]
Zzz79
Member

Откуда:
Сообщений: 1005
SELECT me.email,CAST (pc.poll_id as text),CAST((select extract (epoch from me.unsubscribe_date)) as text)

странно что в джава коде я на выходе получаю лист с массивом стрингов - но постман возвращает 500 ошибку
в логах пусто..
17 ноя 20, 15:51    [22233897]     Ответить | Цитировать Сообщить модератору
 Re: Немного SQL перенести на хибер  [new]
mayton
Member

Откуда: loopback
Сообщений: 49763
Между постманом и твоим запросом еще стоит стек технологий. И этот стек формирует 500-тку.
17 ноя 20, 15:55    [22233900]     Ответить | Цитировать Сообщить модератору
 Re: Немного SQL перенести на хибер  [new]
Zzz79
Member

Откуда:
Сообщений: 1005
mayton
Между постманом и твоим запросом еще стоит стек технологий. И этот стек формирует 500-тку.

так непонятно что не нравится= когда я руками кастил в в цикле и руками же клал в список массивы стрингов все было ок

сейчс же я дебагером вижу тот же самый список массивов - но получаю ошибку 500
х.уй пойми что происходит- ошибок нигде нет .....
17 ноя 20, 16:05    [22233908]     Ответить | Цитировать Сообщить модератору
 Re: Немного SQL перенести на хибер  [new]
mayton
Member

Откуда: loopback
Сообщений: 49763
Сколько строк возвращает твой запрос в этом кейсе?
17 ноя 20, 16:07    [22233912]     Ответить | Цитировать Сообщить модератору
 Re: Немного SQL перенести на хибер  [new]
Zzz79
Member

Откуда:
Сообщений: 1005
похоже на то ,что резульатом выполнения nativeQuery всегда будет лист объектов,ему пох что там у тебя в выборке лежат String
все равно надо прокастить все руками в стринги
17 ноя 20, 16:12    [22233917]     Ответить | Цитировать Сообщить модератору
 Re: Немного SQL перенести на хибер  [new]
Leonid Kudryavtsev
Member

Откуда:
Сообщений: 9249
Zzz79
что резульатом выполнения nativeQuery всегда будет лист объектов


Жесть какая.
А String это не объект ?
Посмотреть в отладчике/добавить_в_лог конкретный тип объекта религия не позволяет?
17 ноя 20, 16:14    [22233921]     Ответить | Цитировать Сообщить модератору
 Re: Немного SQL перенести на хибер  [new]
mayton
Member

Откуда: loopback
Сообщений: 49763
Zzz79
похоже на то ,что резульатом выполнения nativeQuery всегда будет лист объектов,ему пох что там у тебя в выборке лежат String
все равно надо прокастить все руками в стринги

Так JDBC и работает. Ты сам, обладая знаниями о типах которые описывает SELECT-выражение делаешь
кастинг к нужному java class.
17 ноя 20, 16:17    [22233925]     Ответить | Цитировать Сообщить модератору
 Re: Немного SQL перенести на хибер  [new]
Zzz79
Member

Откуда:
Сообщений: 1005
mayton
Сколько строк возвращает твой запрос в этом кейсе?

сколько ансаберов будет в базе - столько и возвратит
или про что ты спрашиваешь?
сам список выглядит как
List<String[]>data
где string[]={email,pid,unixtime}
17 ноя 20, 16:17    [22233926]     Ответить | Цитировать Сообщить модератору
 Re: Немного SQL перенести на хибер  [new]
Zzz79
Member

Откуда:
Сообщений: 1005
mayton
Zzz79
похоже на то ,что резульатом выполнения nativeQuery всегда будет лист объектов,ему пох что там у тебя в выборке лежат String
все равно надо прокастить все руками в стринги

Так JDBC и работает. Ты сам, обладая знаниями о типах которые описывает SELECT-выражение делаешь
кастинг к нужному java class.

плохо,слишком глупый jdbс должен видеть что к нему приходит!)
17 ноя 20, 16:18    [22233928]     Ответить | Цитировать Сообщить модератору
 Re: Немного SQL перенести на хибер  [new]
Leonid Kudryavtsev
Member

Откуда:
Сообщений: 9249
mayton

Так JDBC и работает. Ты сам, обладая знаниями о типах которые описывает SELECT-выражение делаешь
кастинг к нужному java class.

---
Ерунда полная. Ну или так сформулировано.
17 ноя 20, 16:27    [22233935]     Ответить | Цитировать Сообщить модератору
 Re: Немного SQL перенести на хибер  [new]
Zzz79
Member

Откуда:
Сообщений: 1005
Leonid Kudryavtsev
Zzz79
что резульатом выполнения nativeQuery всегда будет лист объектов


Жесть какая.
А String это не объект ?
Посмотреть в отладчике/добавить_в_лог конкретный тип объекта религия не позволяет?

Ладно не ворчи) я разобрался- просто надо было поменять тип данных отправляемых c String на Object,тогда в джава коде ничего не надо кастить,все прилетает как я в SQL запросе написал

вери гуд)
17 ноя 20, 16:30    [22233939]     Ответить | Цитировать Сообщить модератору
 Re: Немного SQL перенести на хибер  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 6525
Zzz79
плохо,слишком глупый jdbс должен видеть что к нему приходит!)
неа.
int a = recordSet.fields[3].asInteger()
17 ноя 20, 16:41    [22233948]     Ответить | Цитировать Сообщить модератору
 Re: Немного SQL перенести на хибер  [new]
mayton
Member

Откуда: loopback
Сообщений: 49763
Leonid Kudryavtsev
mayton

Так JDBC и работает. Ты сам, обладая знаниями о типах которые описывает SELECT-выражение делаешь
кастинг к нужному java class.

---
Ерунда полная. Ну или так сформулировано.

Можешь быть главным! Чини самолёт!

+
17 ноя 20, 16:43    [22233951]     Ответить | Цитировать Сообщить модератору
 Re: Немного SQL перенести на хибер  [new]
Leonid Kudryavtsev
Member

Откуда:
Сообщений: 9249
        Statement stmt =  conn.createStatement();
        ResultSet rset = stmt.executeQuery(" SELECT 12345 n, 'test' as s, sysdate as dt FROM dual" );
        while ( rset.next() ) {
            for ( int i=1; i<4; i++ ) {
                Object o;
                o = rset.getObject(i);
                System.out.println( o.toString()+" "+o.getClass().getCanonicalName() );
            }
        }
        rset.close();
        stmt.close();


12345 java.math.BigDecimal
test java.lang.String
2020-11-17 17:16:10.0 java.sql.Timestamp
17 ноя 20, 17:15    [22233982]     Ответить | Цитировать Сообщить модератору
 Re: Немного SQL перенести на хибер  [new]
mayton
Member

Откуда: loopback
Сообщений: 49763
Разные варианты кастинга (PostgresQL).

dht=> select 555::integer, 555::float, '{ "Hello" : "world" }', '{ "Hello" : "world" }'::JSON;
 int4 | float8 |       ?column?        |         json          
------+--------+-----------------------+-----------------------
  555 |    555 | { "Hello" : "world" } | { "Hello" : "world" }
(1 row)


И классический вариант по Ansi-SQL

dht=> select CAST(555 as integer) ..... 
17 ноя 20, 17:53    [22234028]     Ответить | Цитировать Сообщить модератору
 Re: Немного SQL перенести на хибер  [new]
Zzz79
Member

Откуда:
Сообщений: 1005
Подведу итоги промежуточный вариант
import org.springframework.stereotype.Service;

import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;
import java.sql.Timestamp;
import java.time.Instant;
import java.util.List;
import java.util.Optional;

@Service
public class UnsuberRepositoryCustomImpl implements UnsuberRepositoryCustom {

    @PersistenceContext
    private EntityManager em;

    private final Timestamp MIN_VALUE = Timestamp.valueOf("1970-01-01 00:00:00");
    private final Timestamp MAX_VALUE = Timestamp.valueOf("2038-01-01 00:00:00");

    public Query getQuery( UnsuberRequest request) {

        String pollIdPredicate = request == null || request.getPid() == null ? "" : "and p.id = ? ";

        Query query = em.createNativeQuery("select me.email , CAST (pc.poll_id as varchar ) , CAST ((select extract (epoch from me.unsubscribe_date)) as varchar ) " +
                "from space s " +
                "join \"user\" u on (s.id = u.space_id) " +
                "join poll p on (u.id = p.user_id) " +
                "join poll_channel pc on (p.id  =pc.poll_id) " +
                "join mailing m on (pc.id = m.poll_channel_id) " +
                "join mailing_list_email mle on (m.id = mle.mailing_id) " +
                "join mailing_email me on (mle.email_id = me.id) " +
                "where s.id = ? " +
                pollIdPredicate +
                "and me.unsubscribed = 'true' " +
                "and me.unsubscribe_date between ? and ? ");

        return query;
    }

    @Override
    public List<Object[]> unsuberList(Long spaceId,  UnsuberRequest request) {

        Query query = getQuery(request);
        Timestamp fr = request == null ? MIN_VALUE : Optional.ofNullable(converter(request.getDateFrom()))
                .orElse(MIN_VALUE);
        Timestamp to = request == null ? MAX_VALUE : Optional.ofNullable(converter(request.getDateTo()))
                .orElse(MAX_VALUE);
        query.setParameter(1, spaceId);
        if (request != null && request.getPid() != null) {
            query.setParameter(2, Long.valueOf(request.getPid()));
            query.setParameter(3, fr);
            query.setParameter(4, to);
        } else {
            query.setParameter(2, fr);
            query.setParameter(3, to);

        }
        return query.getResultList();

    }

    private Timestamp converter(Integer i) {
        if (i == null) {
            return null;
        }
        return Timestamp.from(Instant.ofEpochSecond(i));

    }
}

очень хочется избавиться от этого куска
if (request != null && request.getPid() != null) {
            query.setParameter(2, Long.valueOf(request.getPid()));
            query.setParameter(3, fr);
            query.setParameter(4, to);
        } else {
            query.setParameter(2, fr);
            query.setParameter(3, to);

        }

как то другому его изобразить
17 ноя 20, 17:58    [22234032]     Ответить | Цитировать Сообщить модератору
 Re: Немного SQL перенести на хибер  [new]
Leonid Kudryavtsev
Member

Откуда:
Сообщений: 9249
pos_num++
я уже предлагал )))

Сообщение было отредактировано: 17 ноя 20, 17:58
17 ноя 20, 18:00    [22234035]     Ответить | Цитировать Сообщить модератору
 Re: Немного SQL перенести на хибер  [new]
Zzz79
Member

Откуда:
Сообщений: 1005
Leonid Kudryavtsev
pos_num++
я уже предлагал )))

поясню условия
их достаточно много ,но вот эти ифы связаны с одним - что нам может придти заопрос без тела request=null,
может придти запрос с телом но без pid request.getPollId=null
в первых двух случах мы убираем вот эту строчку
"and p.id = ? "

и соотвественно тут надо тоже строку убирать

query.setParameter(2, Long.valueOf(request.getPid()));
17 ноя 20, 18:12    [22234045]     Ответить | Цитировать Сообщить модератору
 Re: Немного SQL перенести на хибер  [new]
Leonid Kudryavtsev
Member

Откуда:
Сообщений: 9249
Я бы так делал:

pos = 1;
query.setParameter( pos++, spaceId );
if (request != null && request.getPid() != null) {
  query.setParameter( pos++, Long.valueOf(request.getPid()));
}
query.setParameter( pos++, fr );
query.setParameter (pos++, to );
17 ноя 20, 18:22    [22234053]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: Ctrl  назад   1 2 3 4 5 6 7 [8] 9 10   вперед  Ctrl      все
Все форумы / Java Ответить