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

Откуда:
Сообщений: 1007
mayton
Как-то так
import static org.apache.commons.lang3.ObjectUtils;

Timestamp fr = firstNonNull(converter(request.getDateFrom()),MIN_VALUE);

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

Откуда: loopback
Сообщений: 49768
Zzz79
mayton
Или чтоб не сбивалась нумерация - завести счетчик bind-variables. Они все равно строго по порядку идут.

Тогда будет как-то так.
"and me.unsubscribe_date between ?" + (cnt++) + " and ?" + (cnt++) 

нечитабельно совсем ,я все понимаю что там можно нарефкаторить) но надо помнить,что люди будут этого код поддерживать и вот такая инкрементация будет тяжела для восприятия- где тут первая позиция ,где вторая?

По Ansi-SQL стандарту там цыфирки необязательны. Проверь это.
16 ноя 20, 17:47    [22233169]     Ответить | Цитировать Сообщить модератору
 Re: Немного SQL перенести на хибер  [new]
mayton
Member

Откуда: loopback
Сообщений: 49768
Zzz79
mayton
Как-то так
import static org.apache.commons.lang3.ObjectUtils;

Timestamp fr = firstNonNull(converter(request.getDateFrom()),MIN_VALUE);

выйгрышь в 10 литералов,зато тащим ненужную библиотеку в проект - за это сразу спросят ,ну и билд градл разрастется на еще больщше количества кода.Otional прекрасно справляется с этим без сторонних библиотек

У тебя задача-прим - сделать ясный и читабельный код. А performance-инцеденты о которых ты говоришь - гипотетические
и я готов спорить на виски что в твоей задаче основная нагрузка падает не на строки с мусором а на фазу исполнения
запроса. По фремени эта фаза будут тысячекратно превышать все остальное.

Не парься строками. А думай о том как сделать код ясным и понятным чтобы ты сам его открыв через 2 месяца
сумел вспомнить что это и какого хрена оно делает.

Грубо говоря посмотри на свой код чужими глазами. С сарказмом посмотри.

P.S. Apache Commons это очень популярная либа и она уже может быть у тебя подключена транзитивно. Проверь.

Сообщение было отредактировано: 16 ноя 20, 17:46
16 ноя 20, 17:49    [22233172]     Ответить | Цитировать Сообщить модератору
 Re: Немного SQL перенести на хибер  [new]
mayton
Member

Откуда: loopback
Сообщений: 49768
По поводу JPA / Criteria API с которыми форум Java бегает как с "писаной торбой".

Есть скромный и очень полезный фреймворк под названием MyBatis https://mybatis.org/mybatis-3/dynamic-sql.html
Он на декларативном уровне (на уровне конфигов) может делать динамические SQL запросы.

Наподобие
<select id="findActiveBlogWithTitleLike"
     resultType="Blog">
  SELECT * FROM BLOG
  WHERE state = ‘ACTIVE’
  <if test="title != null">
    AND title like #{title}
  </if>
</select>


Я его использовал. Он работает и решает такие задачи.

Я не предлагаю тебе прям сейчас его затаскивать в проект. Но просто знай о том что
эта задача уже тыщу раз решалась и шаблонизаторы нативных запросов давно существуют.
16 ноя 20, 18:02    [22233190]     Ответить | Цитировать Сообщить модератору
 Re: Немного SQL перенести на хибер  [new]
Leonid Kudryavtsev
Member

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

Там "шаблонизации" на 5 строк кода. Кто, с чем и почему "бегает с писаной торбой" мне не понятно.

+

Прижатый Афродитой к стене, он лежал, думал. Действительно, каждая лошадь работает много, побольше любой обезьяны. На ней ездят верхом, на ней пашут, возят всевозможные грузы. Лошадь работает летом и зимой по многу часов, не зная ни выходных, ни отпусков.
Животное, конечно, не самое глупое, но все же ни одна из всех лошадей, которых знал Гладышев, не стала еще человеком. Не находя сколь-нибудь удобного объяснения такой загадке природы, Гладышев шумно вздохнул.
16 ноя 20, 18:26    [22233208]     Ответить | Цитировать Сообщить модератору
 Re: Немного SQL перенести на хибер  [new]
mayton
Member

Откуда: loopback
Сообщений: 49768
О пользе и вреде шаблонизации сейчас в проекте Стаса мы не можем говорить. Мы не видели весь проект.
Следовательно наши знания - ограничены.

Я просто говорю о том что мир - сложен и разнообразен. Но если разработчик знает только молоток
то всё вокруг него кажется гвоздями.

Я не против JPA/Hibernate. Но я удивляюсь через какие анальные муки проходит разработка JOIN
когда главных техлид проекта сказал джуну - "иди.... копай отсюдова до забора". И джун в слезах
идет копать JOIN на всяких там критериях апи.

Да мне-то что! Мне пофиг. Мне их время не жалко. Мне за отрасль обидно.
16 ноя 20, 19:09    [22233257]     Ответить | Цитировать Сообщить модератору
 Re: Немного SQL перенести на хибер  [new]
Zzz79
Member

Откуда:
Сообщений: 1007
mayton
Zzz79
пропущено...

нечитабельно совсем ,я все понимаю что там можно нарефкаторить) но надо помнить,что люди будут этого код поддерживать и вот такая инкрементация будет тяжела для восприятия- где тут первая позиция ,где вторая?

По Ansi-SQL стандарту там цыфирки необязательны. Проверь это.
\
по цифорам я понял что вы имели ввиду- сейчас переделаю,тогда вообще уберется строка с временем
а вот на счет апаче комонс - спросил нам не дадут это - есть требования по размеру докер контейнера - все не нужные либы мы убиваем- все в рамках стандартных библиотек
17 ноя 20, 10:02    [22233515]     Ответить | Цитировать Сообщить модератору
 Re: Немного SQL перенести на хибер  [new]
Zzz79
Member

Откуда:
Сообщений: 1007
mayton
По поводу JPA / Criteria API с которыми форум Java бегает как с "писаной торбой".

Есть скромный и очень полезный фреймворк под названием MyBatis https://mybatis.org/mybatis-3/dynamic-sql.html
.

любой код можно всегда облегчить и нет предела рефакторингу)
Но любое подключение в проект новых библиотек- это жопа боль многих отделов
0.Обосновать необходимость применения ( я так и вижу как я стою у руковдства и обьясяю - ну знаете на 3 буквы в строчке меньше будет,они такие ну давай потратим на это пару миллионов рублей и запустим процессы ниже)
1.этап пройти свой ДИЗ
2.Пройти ДИЗ клиента

например сбер нам недавно завернул какой то пакет на фронте - с пометкой СБ - без обьяснения причин(там у них стоит какая то шляпа ,которая зависимости на уязвимость проверяет)

так что можно делать красиво,но на фрилансе)
17 ноя 20, 10:26    [22233528]     Ответить | Цитировать Сообщить модератору
 Re: Немного SQL перенести на хибер  [new]
Zzz79
Member

Откуда:
Сообщений: 1007
ПРичем я все равно вижу решение с Optional более изящным и читаемым,так как не факт что те кто поддерживают код,будут знакомы с библиотекой апаче комонс и будет ли она вообще через пару лет большой вопрос
17 ноя 20, 10:27    [22233530]     Ответить | Цитировать Сообщить модератору
 Re: Немного SQL перенести на хибер  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 6525
Zzz79,
ТСу виднее. Оформи решение и закрой топик.
17 ноя 20, 11:27    [22233565]     Ответить | Цитировать Сообщить модератору
 Re: Немного SQL перенести на хибер  [new]
Андрей Панфилов
Member

Откуда: Москва > Melbourne
Сообщений: 3778
mayton
По поводу JPA / Criteria API с которыми форум Java бегает как с "писаной торбой".

Есть скромный и очень полезный фреймворк под названием MyBatis https://mybatis.org/mybatis-3/dynamic-sql.html
Он на декларативном уровне (на уровне конфигов) может делать динамические SQL запросы...


Любой человек, который пытается хоть как-то глянуть в сторону MyBatis должен первым делом открыть что-то в духе этого, после чего принять решение, действительно ли MyBatis не противоречит его внутреннему представлению о прекрасном или нет.
17 ноя 20, 13:29    [22233676]     Ответить | Цитировать Сообщить модератору
 Re: Немного SQL перенести на хибер  [new]
Zzz79
Member

Откуда:
Сообщений: 1007
Leonid Kudryavtsev
AFAIK В Хибере есть поддержка Native Query

Пример откуда-то из И-нета. Отсутвия ResultSet'а делать нетипизированную фигню ничуть не мешает )))
// Native query selecting all columns
List<Object[]> departments = session.createNativeQuery("SELECT * FROM department").list();
for (Object[] objects : departments) {
  Integer id=(Integer)objects[0];
  String name=(String)objects[1];
  System.out.println("Department["+id+","+name+"]");
}


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

 ["<client_email>", "<poll_id>", "unsub_date"]


я так понимаю что изначально мы вытаскиваем лист с массивам объектов,как бы теперь это превратить в лист с массивами String
при этом в выборке идет строка,таймстамп и бигИнтеджер
17 ноя 20, 13:38    [22233688]     Ответить | Цитировать Сообщить модератору
 Re: Немного SQL перенести на хибер  [new]
Zzz79
Member

Откуда:
Сообщений: 1007
PetroNotC Sharp
Zzz79,
ТСу виднее. Оформи решение и закрой топик.

решение завернули) надо переделывать)
17 ноя 20, 13:38    [22233691]     Ответить | Цитировать Сообщить модератору
 Re: Немного SQL перенести на хибер  [new]
Zzz79
Member

Откуда:
Сообщений: 1007
Лепим вот такие костыли
      List<Object[]>objects=query.getResultList();
        List<String[]>strings=new ArrayList<>();

        for(Object[]o:objects){
            String[]stingArr=new String[3];
            stingArr[0]=(String)o[0];
            Timestamp t=(Timestamp)o[1];
            stingArr[1]=String.valueOf(t.getTime());
            BigInteger bigInteger =(BigInteger) o[2];
            stingArr[2]=bigInteger.toString();
            strings.add(stingArr);
        }

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

вместо вот такого красивого решения
 query.unwrap(org.hibernate.Query.class)
                .setResultTransformer(Transformers.aliasToBean(UnsuberResponse.class));
        return query.getResultList();
17 ноя 20, 13:59    [22233716]     Ответить | Цитировать Сообщить модератору
 Re: Немного SQL перенести на хибер  [new]
Leonid Kudryavtsev
Member

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

...теперь это список массивов с стрингами,есть у кого то мысли как это сделать покрасивее ,ибо конструкция совсем печальная...


В SQL добавить TO_CHAR для все не стринговых полей )))
И, удивительно, список List<Object> превратиться, превратиться... в List<String> )))
17 ноя 20, 14:04    [22233720]     Ответить | Цитировать Сообщить модератору
 Re: Немного SQL перенести на хибер  [new]
Leonid Kudryavtsev
Member

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

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


Те кто ставили задачу, похоже достаточно вменяемые люди, НЕ страдающие хибернейтом головного мозга и маппингом где нужно и не нужно )))

В общем, если бы правильно прочитали изначально, то даже 2-ой страницы данной темы бы не было ))) (с которых начало многостраничное обсуждение разные сортов маппинга)
17 ноя 20, 14:07    [22233724]     Ответить | Цитировать Сообщить модератору
 Re: Немного SQL перенести на хибер  [new]
Leonid Kudryavtsev
Member

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

String[]stingArr=new String[3];
stingArr[0]=(String)o[0];
Timestamp t=(Timestamp)o[1];
stingArr[1]=String.valueOf(t.getTime());

почему не в цикле?
чем Object.toString() не угодил?
хоть это очень плохой вариант, т.к. для преобразований типа число->строка, дата->строка нужна форматная маска. А числа могут быть разные: деньги (2 знака после запятой), разные кол-ва (другое кол-во знаков после запятой), научные данные (e) etc

задача плавно превращается в студенческую поделку (((

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

Откуда:
Сообщений: 1007
Leonid Kudryavtsev
Zzz79

String[]stingArr=new String[3];
stingArr[0]=(String)o[0];
Timestamp t=(Timestamp)o[1];
stingArr[1]=String.valueOf(t.getTime());

почему не в цикле?
 for(Object[]o:objects){

а это по вашему что?
17 ноя 20, 14:20    [22233749]     Ответить | Цитировать Сообщить модератору
 Re: Немного SQL перенести на хибер  [new]
Zzz79
Member

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


Те кто ставили задачу, похоже достаточно вменяемые люди, НЕ страдающие хибернейтом головного мозга и маппингом где нужно и не нужно )))

тут все наоборот) я пишу АПИ,которое должно 1 в 1 быть как апи сервиса,написанного на node.js с nosql бд
у менять есть роуты старого сервиса ,запросы и что возвращает - я должен это повторить на новом сервисе,где совсем другая модель данных ,другой яп,другая бд и тд.
поэтому возвращался масссив строк скорей всего потому что nosql помойка так их и хранила,но это лирика
17 ноя 20, 14:23    [22233752]     Ответить | Цитировать Сообщить модератору
 Re: Немного SQL перенести на хибер  [new]
Zzz79
Member

Откуда:
Сообщений: 1007
Leonid Kudryavtsev
Zzz79

...теперь это список массивов с стрингами,есть у кого то мысли как это сделать покрасивее ,ибо конструкция совсем печальная...


В SQL добавить TO_CHAR для все не стринговых полей )))
И, удивительно, список List<Object> превратиться, превратиться... в List<String> )))

в бд лежит TimeStamp как дата,мне нужно отдать в секундах ,вангую если я переведу дату TO_CHAR - то вместо 12423532524 получу 2020-12-12 00:00:00
17 ноя 20, 14:25    [22233756]     Ответить | Цитировать Сообщить модератору
 Re: Немного SQL перенести на хибер  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 6525
Zzz79
Лепим вот такие костыли
      List<Object[]>objects=query.getResultList();
        List<String[]>strings=new ArrayList<>();

        for(Object[]o:objects){
            String[]stingArr=new String[3];
            stingArr[0]=(String)o[0];
            Timestamp t=(Timestamp)o[1];
            stingArr[1]=String.valueOf(t.getTime());
            BigInteger bigInteger =(BigInteger) o[2];
            stingArr[2]=bigInteger.toString();
            strings.add(stingArr);
        }


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

вместо вот такого красивого решения
 query.unwrap(org.hibernate.Query.class)
                .setResultTransformer(Transformers.aliasToBean(UnsuberResponse.class));
        return query.getResultList();

В цикле делай сразу json.
17 ноя 20, 14:28    [22233765]     Ответить | Цитировать Сообщить модератору
 Re: Немного SQL перенести на хибер  [new]
Zzz79
Member

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


щас посмотрим как это переварится в java коде
17 ноя 20, 15:02    [22233824]     Ответить | Цитировать Сообщить модератору
 Re: Немного SQL перенести на хибер  [new]
mayton
Member

Откуда: loopback
Сообщений: 49768
Zzz79
mayton
По поводу JPA / Criteria API с которыми форум Java бегает как с "писаной торбой".

Есть скромный и очень полезный фреймворк под названием MyBatis https://mybatis.org/mybatis-3/dynamic-sql.html
.

любой код можно всегда облегчить и нет предела рефакторингу)
Но любое подключение в проект новых библиотек- это жопа боль многих отделов
0.Обосновать необходимость применения ( я так и вижу как я стою у руковдства и обьясяю - ну знаете на 3 буквы в строчке меньше будет,они такие ну давай потратим на это пару миллионов рублей и запустим процессы ниже)
1.этап пройти свой ДИЗ
2.Пройти ДИЗ клиента

например сбер нам недавно завернул какой то пакет на фронте - с пометкой СБ - без обьяснения причин(там у них стоит какая то шляпа ,которая зависимости на уязвимость проверяет)

так что можно делать красиво,но на фрилансе)

Я не вижу проблемы. Apache Commons Lang это опенсорц. И ты можешь зайти и буквально
скопи-пастить стек этой функции и затащить его себе. Ну ...можешь переименовать если стесняешся.

    @SafeVarargs
    public static <T> T myFavoriteFirstNonNull(final T... values) {
        if (values != null) {
            for (final T val : values) {
                if (val != null) {
                    return val;
                }
            }
        }
        return null;
    }


Кстати покажи свои проектные зависимости.

$ mvn dependency:list


Возможно твоя безопасность уже обоср... облажалась только еще не вкурсе.
Не бойся насчет названия конторы. Тут - всем пофиг на самом деле.
17 ноя 20, 15:06    [22233835]     Ответить | Цитировать Сообщить модератору
 Re: Немного SQL перенести на хибер  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 6525
Zzz79
вот такой селект
вау. Ты почти sql прогер)))
17 ноя 20, 15:08    [22233838]     Ответить | Цитировать Сообщить модератору
 Re: Немного SQL перенести на хибер  [new]
mayton
Member

Откуда: loopback
Сообщений: 49768
Андрей Панфилов
mayton
По поводу JPA / Criteria API с которыми форум Java бегает как с "писаной торбой".

Есть скромный и очень полезный фреймворк под названием MyBatis https://mybatis.org/mybatis-3/dynamic-sql.html
Он на декларативном уровне (на уровне конфигов) может делать динамические SQL запросы...


Любой человек, который пытается хоть как-то глянуть в сторону MyBatis должен первым делом открыть что-то в духе этого, после чего принять решение, действительно ли MyBatis не противоречит его внутреннему представлению о прекрасном или нет.

Я не против.
17 ноя 20, 15:08    [22233839]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: Ctrl  назад   1 2 3 4 5 6 [7] 8 9 10   вперед  Ctrl      все
Все форумы / Java Ответить