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

Откуда:
Сообщений: 1005
Вынес обсуждение в отдельную тему
собственно сам запрос написан
SELECT me.email,me.unsubscribe_date,pc.poll_id
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=1 
and me.unsubscribed='true'
and me.unsubscribe_date between '10.03.2019' and '10.03.2020';


тут несколько вопросов
1. возможно ли такое написать для хибера
2.во что положить результат запроса ,ведь хиберу нужно знать насколько я понимаю куда результ класть,это же не resultSet
3.
join mailing_list_email mle on (m.id=mle.mailing_id)

эта таблица создается видимо автоматом как отношение многие ко многим между таблицами mailing_list и mailing_email

Сообщение было отредактировано: 12 ноя 20, 13:48
12 ноя 20, 13:49    [22230729]     Ответить | Цитировать Сообщить модератору
 Re: Немного SQL перенести на хибер  [new]
Leonid Kudryavtsev
Member

Откуда:
Сообщений: 9249
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+"]");
}


Сообщение было отредактировано: 12 ноя 20, 13:49
12 ноя 20, 13:51    [22230731]     Ответить | Цитировать Сообщить модератору
 Re: Немного SQL перенести на хибер  [new]
Zzz79
Member

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


1 во что положить рузультирующую выборку?
2 в каком репозитории этот метод писать в Space?
12 ноя 20, 13:54    [22230738]     Ответить | Цитировать Сообщить модератору
 Re: Немного SQL перенести на хибер  [new]
Zzz79
Member

Откуда:
Сообщений: 1005
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+"]");
}


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

 @ManyToMany(
      fetch = FetchType.EAGER,
      cascade = CascadeType.MERGE
  )
  @JoinTable(
      name = EMailingList.TABLE_LIST,
      joinColumns = @JoinColumn(name = "mailing_id"),
      inverseJoinColumns = @JoinColumn(name = "email_id"))
  private List<EMailingEmail> emails;
12 ноя 20, 13:57    [22230743]     Ответить | Цитировать Сообщить модератору
 Re: Немного SQL перенести на хибер  [new]
Leonid Kudryavtsev
Member

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

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

осталось только понять, что вся эта фраза значит ))) и куда и что Вам нужно прописать )))
если в Native Query - то таблица она и есть таблица (разницы кто и как ее создавал нет)
если в HQL - то тут я не знаю, не работал с Hibernate очень давно
12 ноя 20, 14:01    [22230749]     Ответить | Цитировать Сообщить модератору
 Re: Немного SQL перенести на хибер  [new]
Zzz79
Member

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

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

осталось только понять, что вся эта фраза значит ))) и куда и что Вам нужно прописать )))
если в Native Query - то таблица она и есть таблица (разницы кто и как ее создавал нет)
если в HQL - то тут я не знаю, не работал с Hibernate очень давно

а ну вот это и надо было понять ,писать буду как натив query конечно,HQL тут не поможет явно
12 ноя 20, 14:11    [22230756]     Ответить | Цитировать Сообщить модератору
 Re: Немного SQL перенести на хибер  [new]
Leonid Kudryavtsev
Member

Откуда:
Сообщений: 9249
Если все таблицы описаны/сделаны в Hibernate, то в чем проблема с HQL, мне не понятно.

Ну да ладно. Сам я ни HQL, ни Hibernate не знаю/не люблю.
12 ноя 20, 14:14    [22230757]     Ответить | Цитировать Сообщить модератору
 Re: Немного SQL перенести на хибер  [new]
Zzz79
Member

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

таблицы сделаны руками ,проливаются flyway скрипты
хибер выступает в роли валидатора ,но не создателя таблиц
12 ноя 20, 14:24    [22230768]     Ответить | Цитировать Сообщить модератору
 Re: Немного SQL перенести на хибер  [new]
mayton
Member

Откуда: loopback
Сообщений: 49762
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+"]");
}

Еще один вариант на SpringData

@Query(
  value = "SELECT me.email,me.unsubscribe_date,pc.poll_id ..... ", 
  nativeQuery = true)
Collection<Zzz79FuckenBusinessEntity> findAllActiveUsersNative();
12 ноя 20, 14:26    [22230770]     Ответить | Цитировать Сообщить модератору
 Re: Немного SQL перенести на хибер  [new]
Zzz79
Member

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

@Query(
value = "SELECT me.email,me.unsubscribe_date,pc.poll_id ..... ",
nativeQuery = true)
Collection<Zzz79FuckenBusinessEntity> findAllActiveUsersNative();

[/src]

а в каком классе прописать такое можно?
смотри у меня результируящая выборка это набор из трех столбцов разных таблиц id,data,email
тоесть обычно же опрделяется интерефейс репозитория например вот по юзеру

public interface UsersRepository extends JpaRepository<EUser, Long> {

  Optional<EUser> findByEmailAndEnabledIsTrue(String email);

  @Transactional
  default void updateLastRequestAt(Long userId) {
    findById(userId).ifPresent(e -> e.setLastRequestAt(DbUtil.currentTimestamp()));
  }

  List<EUser> findAllBySpaceId(Long spaceId);

  boolean existsByEmail(String email);

  void deleteByIdAndSpaceId(Long userId, Long spaceId);

}


а где мне метод написать,который ты показал? ведь у меня нет репозитория под Zzz79FuckenBusinessEntity так как таблицы такой нет
12 ноя 20, 14:37    [22230775]     Ответить | Цитировать Сообщить модератору
 Re: Немного SQL перенести на хибер  [new]
mayton
Member

Откуда: loopback
Сообщений: 49762
Zzz79, у тебя какой архе-тип приложения? SpringData?
12 ноя 20, 14:39    [22230777]     Ответить | Цитировать Сообщить модератору
 Re: Немного SQL перенести на хибер  [new]
Zzz79
Member

Откуда:
Сообщений: 1005
mayton
Zzz79, у тебя какой архе-тип приложения? SpringData?

да,вот выше интерфейс репозитория который наследуется от JPAREPOSITORY <Класс таблицы,ТИП PK этой таблицы>
12 ноя 20, 15:06    [22230804]     Ответить | Цитировать Сообщить модератору
 Re: Немного SQL перенести на хибер  [new]
mayton
Member

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

а где мне метод написать,который ты показал? ведь у меня нет репозитория под Zzz79FuckenBusinessEntity так как таблицы такой нет

Всe. Я понял в чем твой вопрос.

Смотри. Ты можешь для любого типа сущности заводить Entity-Class. И не обязательно он должен быть равен таблице.

Более того даже выгодно заводить сущности которые содержат меньше полей (нахрена в ней 100 полей
если для бизнеса надо id и name).
12 ноя 20, 15:13    [22230810]     Ответить | Цитировать Сообщить модератору
 Re: Немного SQL перенести на хибер  [new]
Zzz79
Member

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

а где мне метод написать,который ты показал? ведь у меня нет репозитория под Zzz79FuckenBusinessEntity так как таблицы такой нет

Всe. Я понял в чем твой вопрос.

Смотри. Ты можешь для любого типа сущности заводить Entity-Class. И не обязательно он должен быть равен таблице.

Более того даже выгодно заводить сущности которые содержат меньше полей (нахрена в ней 100 полей
если для бизнеса надо id и name).

так в этой сущности же будет 3 поля из разных других таблиц

посмотри еще вот запрос сам
SELECT me.email,me.unsubscribe_date,pc.poll_id
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=1 
and me.unsubscribed='true'
and me.unsubscribe_date between '10.03.2019' and '10.03.2020';
12 ноя 20, 15:20    [22230818]     Ответить | Цитировать Сообщить модератору
 Re: Немного SQL перенести на хибер  [new]
Zzz79
Member

Откуда:
Сообщений: 1005
щас попробую сделать как ты говоришь -но что то мне подсказывает потерплю фиаско
12 ноя 20, 15:21    [22230819]     Ответить | Цитировать Сообщить модератору
 Re: Немного SQL перенести на хибер  [new]
mayton
Member

Откуда: loopback
Сообщений: 49762
Ну смотри. С точки зрения JDBC никаких таблиц не существует. Драйвер возвращает абстрактный
набор под название ResultSet который может быть или таблицей или view или просто джойном
5 таблиц или вообще быть синтетическим ответом.

Например в Postgresql можно написать так

SELECT 'Hello World';


И такой ответ можно получить и обработать в JDBC.

Хибер + SpringData это просто еще более высокоуровневые абстракции над этой моделью JDBC.

Им тем более пофиг какие были таблицы.
12 ноя 20, 15:25    [22230822]     Ответить | Цитировать Сообщить модератору
 Re: Немного SQL перенести на хибер  [new]
вадя
Member

Откуда: Екатеринбург
Сообщений: 18324
ДА ЗДРАВСТВУЕТ ХИБЕР!!!

12 ноя 20, 15:37    [22230837]     Ответить | Цитировать Сообщить модератору
 Re: Немного SQL перенести на хибер  [new]
mayton
Member

Откуда: loopback
Сообщений: 49762
Щас.... Стас тестирует новую опцию.

Подождем.
12 ноя 20, 15:40    [22230838]     Ответить | Цитировать Сообщить модератору
 Re: Немного SQL перенести на хибер  [new]
вадя
Member

Откуда: Екатеринбург
Сообщений: 18324
mayton
... Стас тестирует новую опцию.
новую опцию хибера или новую опцию своих знаний?
12 ноя 20, 15:55    [22230850]     Ответить | Цитировать Сообщить модератору
 Re: Немного SQL перенести на хибер  [new]
Zzz79
Member

Откуда:
Сообщений: 1005
mayton
Щас.... Стас тестирует новую опцию.

Подождем.

так не рабоатет -хибер видит что нет такой таблицы и машет нам ручкой

Unable to build Hibernate SessionFactory; nested exception is org.hibernate.tool.schema.spi.SchemaManagementException: Schema-validation: missing table [unsuber]


собственно поэтму у меня и было вопрос ,где мне написать вот этот метод
 @Query(value = "SELECT me.email,me.unsubscribe_date,pc.poll_id " +
            "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= :pollId" +
            "and me.unsubscribed='true'" +
            "and me.unsubscribe_date between :from and :to",nativeQuery = true)
    List<Unsuber>unsuberList(Long pollId,Timestamp from,Timestamp to);


таблицы Unsuber нет-тоест я не могу сделать вот так

import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;

import javax.persistence.Entity;
import javax.persistence.Id;
import java.sql.Timestamp;

@Getter
@Setter
@NoArgsConstructor
@Entity
public class Unsuber {

    @Id
    private Long pollId;
    private String email;
    private Timestamp unsubscribe_date;


}

и потом вот так
public interface UnsuberRepository extends JpaRepository<Unsuber,Long>

именно в этом интерфейсе я бы смог написать этот метод
вообщем хз что делать пока не понятно
руками вытаскивать откуда то EntityManager если только и делать все вручную тоже не вариант ,неужели нет способа ?
12 ноя 20, 15:57    [22230851]     Ответить | Цитировать Сообщить модератору
 Re: Немного SQL перенести на хибер  [new]
mayton
Member

Откуда: loopback
Сообщений: 49762
А так сделай + геттеры и сеттеры.


public class Unsuber {

    private Long pollId;
    private String email;
    private Timestamp unsubscribe_date;

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

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


1 во что положить рузультирующую выборку?
2 в каком репозитории этот метод писать в Space?

1. Если в xml забирает другая ИС то и переложи в xml
Какой формат и кто забирает?
12 ноя 20, 16:04    [22230862]     Ответить | Цитировать Сообщить модератору
 Re: Немного SQL перенести на хибер  [new]
Zzz79
Member

Откуда:
Сообщений: 1005
mayton,
а в какой репозиторий тогда положит сам метод запроса?
ведь так уже не прокатит
public interface UnsuberRepository extends JpaRepository<Unsuber,Long> {

    @Query(value = "SELECT me.email,me.unsubscribe_date,pc.poll_id " +
            "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= :pollId" +
            "and me.unsubscribed='true'" +
            "and me.unsubscribe_date between :from and :to",nativeQuery = true)
    List<Unsuber>unsuberList(Long pollId,Timestamp from,Timestamp to);
}
12 ноя 20, 16:06    [22230866]     Ответить | Цитировать Сообщить модератору
 Re: Немного SQL перенести на хибер  [new]
Zzz79
Member

Откуда:
Сообщений: 1005
PetroNotC Sharp
Zzz79
пропущено...


1 во что положить рузультирующую выборку?
2 в каком репозитории этот метод писать в Space?

1. Если в xml забирает другая ИС то и переложи в xml
Какой формат и кто забирает?

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

Откуда:
Сообщений: 6525
Список объектов нужен только тогда, когда с ними работает java.
Иначе не нужный промежуточный этап выгрузки.
12 ноя 20, 16:06    [22230868]     Ответить | Цитировать Сообщить модератору
 Re: Немного SQL перенести на хибер  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 6525
Zzz79
джейсона
значит проблема
recordset - > json?
12 ноя 20, 16:08    [22230870]     Ответить | Цитировать Сообщить модератору
 Re: Немного SQL перенести на хибер  [new]
Zzz79
Member

Откуда:
Сообщений: 1005
Zzz79
mayton,
а в какой репозиторий тогда положит сам метод запроса?
ведь так уже не прокатит
public interface UnsuberRepository extends JpaRepository<Unsuber,Long> {

    @Query(value = "SELECT me.email,me.unsubscribe_date,pc.poll_id " +
            "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= :pollId" +
            "and me.unsubscribed='true'" +
            "and me.unsubscribe_date between :from and :to",nativeQuery = true)
    List<Unsuber>unsuberList(Long pollId,Timestamp from,Timestamp to);
}

потому что JPArepository требует типизации <Обект,Его id>
12 ноя 20, 16:08    [22230872]     Ответить | Цитировать Сообщить модератору
 Re: Немного SQL перенести на хибер  [new]
Zzz79
Member

Откуда:
Сообщений: 1005
PetroNotC Sharp
Zzz79
джейсона
значит проблема
recordset - > json?

проблема в том чтобы понять куда прикрутить этот запрос
12 ноя 20, 16:09    [22230874]     Ответить | Цитировать Сообщить модератору
 Re: Немного SQL перенести на хибер  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 6525
Zzz79
PetroNotC Sharp
пропущено...
значит проблема
recordset - > json?

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

List<Associate> associate = (List<Associate>) session.createSQLQuery(
    "SELECT * FROM associates WHERE fk_id = :id AND fk_associate_id = (SELECT id FROM users WHERE fk_user_type = 2)")
    .addEntity(Associate.class)
    .setParameter("id", id).list();
12 ноя 20, 16:14    [22230875]     Ответить | Цитировать Сообщить модератору
 Re: Немного SQL перенести на хибер  [new]
Zzz79
Member

Откуда:
Сообщений: 1005
PetroNotC Sharp,
а из чего сессию вытащить? это спринг бут
12 ноя 20, 16:23    [22230883]     Ответить | Цитировать Сообщить модератору
 Re: Немного SQL перенести на хибер  [new]
Leonid Kudryavtsev
Member

Откуда:
Сообщений: 9249
из гугла.... поиском думаю найдется
12 ноя 20, 16:24    [22230886]     Ответить | Цитировать Сообщить модератору
 Re: Немного SQL перенести на хибер  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 6525
Leonid Kudryavtsev
из гугла.... поиском думаю найдется
да.
Ваш тоже выше пример был. Только не понял что там ТСу не понравилось)

Сообщение было отредактировано: 12 ноя 20, 16:23
12 ноя 20, 16:27    [22230890]     Ответить | Цитировать Сообщить модератору
 Re: Немного SQL перенести на хибер  [new]
Zzz79
Member

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

Откуда:
Сообщений: 9249
При чем вообще репозиторий? какой репозиторий? зачем и чем он Вам мешает/не нравится?

Вообще Spring не знаю, но вот сильно сомневаюсь, что из кода нельзя получить текущую сессию с БД или, на самый худой конец, создать новую.

какие-то отрывочные слова про запросы, репозитории ну и как положено, без единого примера /компилирующегося/ кода и описания окружения /библиотек/
12 ноя 20, 16:34    [22230898]     Ответить | Цитировать Сообщить модератору
 Re: Немного SQL перенести на хибер  [new]
PetroNotC Sharp
Member

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

Он бредит.
И модели таблиц и их отношений в топике нет.
Щазоткажется предоставить. Как год назад.
12 ноя 20, 16:37    [22230903]     Ответить | Цитировать Сообщить модератору
 Re: Немного SQL перенести на хибер  [new]
Zzz79
Member

Откуда:
Сообщений: 1005
Leonid Kudryavtsev
При чем вообще репозиторий? какой репозиторий? зачем и чем он Вам мешает/не нравится?

Вообще Spring не знаю, но вот сильно сомневаюсь, что из кода нельзя получить текущую сессию с БД или, на самый худой конец, создать новую.

какие-то отрывочные слова про запросы, репозитории ну и как положено, без единого примера /компилирующегося/ кода и описания окружения /библиотек/

получить можно через костыли,не так это делается явно на спринг буте
12 ноя 20, 16:41    [22230910]     Ответить | Цитировать Сообщить модератору
 Re: Немного SQL перенести на хибер  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 6525
Zzz79,
Прямой SQL это не хибер и не бут.
Или крестик снимите или трусы
12 ноя 20, 16:43    [22230912]     Ответить | Цитировать Сообщить модератору
 Re: Немного SQL перенести на хибер  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 6525
Задачка не CRUD а отчетник или выгрузка.
ОРМ противопоказан.
12 ноя 20, 16:45    [22230916]     Ответить | Цитировать Сообщить модератору
 Re: Немного SQL перенести на хибер  [new]
Leonid Kudryavtsev
Member

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

Прямой SQL это не хибер и не бут.
Или крестик снимите или трусы


Авторам спринга Вы об этом сообщили, а то они похоже не знают:

https://spring.io/projects/spring-data-jdbc

????

p.s. не являюсь спецом ни по спрингу, ни по хиберу. т.ч. все изложенное исключительно IMHO и google.com HO
12 ноя 20, 16:48    [22230925]     Ответить | Цитировать Сообщить модератору
 Re: Немного SQL перенести на хибер  [new]
PetroNotC Sharp
Member

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

Откуда:
Сообщений: 9249
Про Ваш спринг не знаю ))), но в Oracle ADF все ровно так, как описывает mayton.

mayton

Смотри. Ты можешь для любого типа сущности заводить Entity-Class. И не обязательно он должен быть равен таблице.

Более того даже выгодно заводить сущности которые содержат меньше полей (нахрена в ней 100 полей если для бизнеса надо id и name)


ну и, на худой конец, СУБД Server Side View никто не отменял

IMHO

p.s. первоя попавшаяся ссылка про Hibernate
https://vladmihalcea.com/map-jpa-entity-to-view-or-sql-query-with-hibernate/

Сообщение было отредактировано: 12 ноя 20, 17:01
12 ноя 20, 16:59    [22230940]     Ответить | Цитировать Сообщить модератору
 Re: Немного SQL перенести на хибер  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 6525
Leonid Kudryavtsev,
Можно и так.
Но я бы не плодил сущности.
А просто
em.createQuery(“select xxxxxxxxxx").gerResultList()
for resList
.....
))))
12 ноя 20, 17:14    [22230958]     Ответить | Цитировать Сообщить модератору
 Re: Немного SQL перенести на хибер  [new]
Zzz79
Member

Откуда:
Сообщений: 1005
Сделал кастомный репозиторий

написал вот такой код,хз будет оно работать или нет
    @PersistenceContext
    private EntityManager em;

    @Override
    public List<Unsuber> unsuberList(Long pollId, Timestamp from, Timestamp to) {
        Query query = em.createNativeQuery("SELECT me.email,me.unsubscribe_date,pc.poll_id" +
                "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= :id" +
                "and me.unsubscribed='true'" +
                "and me.unsubscribe_date between :timeFrom and :timeTo", Unsuber.class);

        query.setParameter("id", pollId);
        query.setParameter("timeFrom", from);
        query.setParameter("timeTo", to);
        return query.getResultList();

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

Откуда:
Сообщений: 6525
Zzz79
написал вот такой код,хз будет оно работать или нет
в кафешке без компа что ли пишешь?
) :
12 ноя 20, 17:34    [22230988]     Ответить | Цитировать Сообщить модератору
 Re: Немного SQL перенести на хибер  [new]
Zzz79
Member

Откуда:
Сообщений: 1005
PetroNotC Sharp
Zzz79
написал вот такой код,хз будет оно работать или нет
в кафешке без компа что ли пишешь?
) :

нет на компе)
не работает данная конструкция

   @PersistenceContext
    private EntityManager em;

    @Override
    public List<Unsuber> unsuberList(Long pollId, Timestamp froms, Timestamp tos) {
        Query query = em.createNativeQuery("select me.email,me.unsubscribe_date,pc.poll_id" +
                "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 =?" +
                "and me.unsubscribed='true'" +
                "and me.unsubscribe_date between =? and =?", Unsuber.class);

        query.setParameter(1, pollId);
        query.setParameter(2, from);
        query.setParameter(3, to);
        return query.getResultList();

    }

ошибка в принципе понятна хибер ничего не знает про этот класс Unsuber.class

Unknown entity: ru.megafon.backend.services.api.Unsuber
12 ноя 20, 18:26    [22231034]     Ответить | Цитировать Сообщить модератору
 Re: Немного SQL перенести на хибер  [new]
Zzz79
Member

Откуда:
Сообщений: 1005
судя по всему как я и преполагал ранее - хибер так просто не умеет- ему нужны Entity( которые представлены таблицам) к сожалению
12 ноя 20, 18:28    [22231035]     Ответить | Цитировать Сообщить модератору
 Re: Немного SQL перенести на хибер  [new]
Zzz79
Member

Откуда:
Сообщений: 1005
PetroNotC Sharp
Leonid Kudryavtsev,
Можно и так.
Но я бы не плодил сущности.
А просто
em.createQuery(“select xxxxxxxxxx").gerResultList()
for resList
.....
))))

и что будет лежать в таком листе? рыба -лебедь и рак?
12 ноя 20, 18:33    [22231041]     Ответить | Цитировать Сообщить модератору
 Re: Немного SQL перенести на хибер  [new]
Zzz79
Member

Откуда:
Сообщений: 1005
PetroNotC Sharp
Zzz79
пропущено...

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

List<Associate> associate = (List<Associate>) session.createSQLQuery(
    "SELECT * FROM associates WHERE fk_id = :id AND fk_associate_id = (SELECT id FROM users WHERE fk_user_type = 2)")
    .addEntity(Associate.class)
    .setParameter("id", id).list();

как ты сам видишь Associate должна быть Entity иначе хибер тебя пошлет далеко и надолго
в моем случае результат не является Enity,он является POJO \
12 ноя 20, 18:35    [22231043]     Ответить | Цитировать Сообщить модератору
 Re: Немного SQL перенести на хибер  [new]
skyANA
Member

Откуда: Зеленоград
Сообщений: 28149
Zzz79,

открой для себя CQS, реализуй Query... Чего ради конкретного запроса репозиторий городить?
12 ноя 20, 19:49    [22231073]     Ответить | Цитировать Сообщить модератору
 Re: Немного SQL перенести на хибер  [new]
Kachalov
Member

Откуда: Москва
Сообщений: 5790
Zzz79

ошибка в принципе понятна хибер ничего не знает про этот класс Unsuber.class

- Вы документацию принципиально не читаете? Маппинг результата на DTO возможен и в рамках JPA, и в рамках Spring Data JPA. Тут примеры. Да и изначальный посыл что только через native SQL это можно сделать - неверный. При наличии адекватных связей между сущностями можно и через JPQL это порешать.
12 ноя 20, 20:27    [22231085]     Ответить | Цитировать Сообщить модератору
 Re: Немного SQL перенести на хибер  [new]
Zzz79
Member

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

открой для себя CQS, реализуй Query... Чего ради конкретного запроса репозиторий городить?


да вроде делаю через Query ,сейчас бьюсь над ситаксисом
вот так это выглядит
    @PersistenceContext
    private EntityManager em;

    @Override
    public List<Object[]> unsuberList(Long pollId, Timestamp froms, Timestamp tos) {
        Query query = em.createNativeQuery("select me.email,me.unsubscribe_date,pc.poll_id " +
                "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 =? " +
                "and me.unsubscribed ='true'" +
                "and me.unsubscribe_date between ? and ?");

        query.setParameter(1, pollId);
        query.setParameter(2, froms);
        query.setParameter(3, tos);
        return query.getResultList();



    }

вот щас так - ловлю тонны синтаксических ошибок
12 ноя 20, 20:29    [22231086]     Ответить | Цитировать Сообщить модератору
 Re: Немного SQL перенести на хибер  [new]
Zzz79
Member

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

ошибка в принципе понятна хибер ничего не знает про этот класс Unsuber.class

- Вы документацию принципиально не читаете? Маппинг результата на DTO возможен и в рамках JPA, и в рамках Spring Data JPA. Тут примеры. Да и изначальный посыл что только через native SQL это можно сделать - неверный. При наличии адекватных связей между сущностями можно и через JPQL это порешать.

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

@SqlResultMapper работает только с классом ,которой помечен @Entity
а хибер не даст приложению встать если нет такой таблицы

Сообщение было отредактировано: 12 ноя 20, 20:31
12 ноя 20, 20:32    [22231087]     Ответить | Цитировать Сообщить модератору
 Re: Немного SQL перенести на хибер  [new]
Kachalov
Member

Откуда: Москва
Сообщений: 5790
Zzz79
прежде чем советовать херню,хотя бы проверяйте ее или глубже немного доки почитайте
@SqlResultMapper работает только с классом ,которой помечен @Entity
а хибер не даст приложению встать если нет такой таблицы

- там примеры разные, Вы же вссе за Spring топите? ну берите пример для Spring и не хамите
12 ноя 20, 20:40    [22231092]     Ответить | Цитировать Сообщить модератору
 Re: Немного SQL перенести на хибер  [new]
Zzz79
Member

Откуда:
Сообщений: 1005
Kachalov
Zzz79
прежде чем советовать херню,хотя бы проверяйте ее или глубже немного доки почитайте
@SqlResultMapper работает только с классом ,которой помечен @Entity
а хибер не даст приложению встать если нет такой таблицы

- там примеры разные, Вы же вссе за Spring топите? ну берите пример для Spring и не хамите

еще раз для тех кто в танке !!!

@SqlResultMapper работает только с классом ,которой помечен @Entity
12 ноя 20, 20:44    [22231094]     Ответить | Цитировать Сообщить модератору
 Re: Немного SQL перенести на хибер  [new]
Kachalov
Member

Откуда: Москва
Сообщений: 5790
Zzz79
еще раз для тех кто в танке !!!

@SqlResultMapper работает только с классом ,которой помечен @Entity

Индусам на аутсорсе посвящается: в приведенной ссылке есть примеры, в том числе использования проекции в Spring Data JPA. Если нет сущностей, нет репозитория, а вообще хз что у вас там есть, вот отличные примеры на все случаи жизни: The best way to map a projection query to a DTO (Data Transfer Object) with JPA and Hibernate, в том числе такой:
List<Tuple> postDTOs = entityManager.createNativeQuery("""
    SELECT
       p.id AS id,
       p.title AS title
    FROM Post p
    WHERE p.created_on > :fromTimestamp
    """, Tuple.class)
.setParameter(
    "fromTimestamp",
    Timestamp.from(
        LocalDate.of(2020, 1, 1)
            .atStartOfDay()
            .toInstant(ZoneOffset.UTC)
    )
)
.getResultList();

Если и это не поможет, есть Spring JdbcTemplate. Лично я проблемы не вижу, но можете продолжать обзываться
12 ноя 20, 20:59    [22231099]     Ответить | Цитировать Сообщить модератору
 Re: Немного SQL перенести на хибер  [new]
Zzz79
Member

Откуда:
Сообщений: 1005
Kachalov

Если и это не поможет, есть Spring JdbcTemplate. Лично я проблемы не вижу, но можете продолжать обзываться

Tuple.class из вашего примера должен быть помечен анотацией Entity иначе хибер вам выдаст ошибку что нет такой сущности

неужели вы думаете я тут целый день сижу и из гугла примеры не попробовал

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

вот сейчас у меня такое выражение
  public List<Object[]> unsuberList(Long pollId, Timestamp froms, Timestamp tos) {
        Query query = em.createNativeQuery("select me.email,me.unsubscribe_date,pc.poll_id " +
                "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 = ?1 " +
                "and me.unsubscribed = 'true'" +
                "and me.unsubscribe_date between ?2 and ?3");

        query.setParameter(1, pollId);
        query.setParameter(2, froms);
        query.setParameter(3, tos);
        return query.getResultList();



    }

и оно падает с ошибкой что такой колонки нет u.space_id хотя она есть и в постргесе работает такой запрос

SELECT me.email,me.unsubscribe_date,pc.poll_id
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=? 
and me.unsubscribed='true'

но как я вижу тут таблица user взята в кавычки
а в коде java user полсьвечивается как ключевое слово - и хз что делать

К сообщению приложен файл. Размер - 46Kb
12 ноя 20, 21:08    [22231106]     Ответить | Цитировать Сообщить модератору
 Re: Немного SQL перенести на хибер  [new]
Kachalov
Member

Откуда: Москва
Сообщений: 5790
Zzz79
Tuple.class из вашего примера должен быть помечен анотацией Entity иначе хибер вам выдаст ошибку что нет такой сущности
неужели вы думаете я тут целый день сижу и из гугла примеры не попробовал
...
чукча не читатель


Tuple
12 ноя 20, 21:18    [22231111]     Ответить | Цитировать Сообщить модератору
 Re: Немного SQL перенести на хибер  [new]
Zzz79
Member

Откуда:
Сообщений: 1005
Kachalov
Zzz79
Tuple.class из вашего примера должен быть помечен анотацией Entity иначе хибер вам выдаст ошибку что нет такой сущности
неужели вы думаете я тут целый день сижу и из гугла примеры не попробовал
...
чукча не читатель


Tuple

да не надо мне это еще вам говорю раз,достану я руками вот так это
    @PostMapping("/unsubs/get-list")
    @ApiOperation(value = "Find all unsubers")
    public List<Unsuber> findAllUnsubers() {
        List<Unsuber>unsuberList=new ArrayList<>();
        List<Object[]> objects = unsuberRepositoryCustom.unsuberList(1l, Timestamp.valueOf("2020-10-09 14:20:26.696344"), Timestamp.valueOf("2020-11-09 14:20:26.696344"));
        for (int i = 0; i <objects.size(); i++) {




            for (Object[] o : objects) {
                Unsuber unsuber=new Unsuber();
                unsuber.setEmail((String)o[0]);
                unsuber.setUnsubscribe_date((Timestamp) o[1]);
                unsuber.setPollId((Long) o[2]);
                unsuberList.add(unsuber);


            }
        }
        return unsuberList;
12 ноя 20, 21:34    [22231119]     Ответить | Цитировать Сообщить модератору
 Re: Немного SQL перенести на хибер  [new]
Kachalov
Member

Откуда: Москва
Сообщений: 5790
Zzz79
да не надо мне это еще вам говорю раз,достану я руками

- можно без рук, вот не самый элегантный способ (вроде можно и получше, но сейчас не могу найти в проектах), но точно работающий:
@Repository
public class NativeRepository {
    
    @Autowired
    private EntityManager entityManager;

    public List<PersonDTO> myNativeQuery() {
        Query query = entityManager.createNativeQuery("select ID, EMAIL from PERSON");
        return query.unwrap(org.hibernate.Query.class)
                .setResultTransformer(Transformers.aliasToBean(PersonDTO.class))
                .getResultList();
    }
    
    public static class PersonDTO {
       
        private BigInteger ID;
        private String EMAIL;
        
        @Override
        public String toString() {
            return ID + "\t" + EMAIL;
        }
        
    }
    
}
12 ноя 20, 23:52    [22231164]     Ответить | Цитировать Сообщить модератору
 Re: Немного SQL перенести на хибер  [new]
mayton
Member

Откуда: loopback
Сообщений: 49762
Из книжки Гуттриэриша. SpringBoot(Data) приложение без всякого маппинга. Тоесть во внутренней
лямбдочке ты сам делаешь любой маппинг. На таблицы нет нигде завязки. Тоесть нет деклараций
типа @Entity @Table(name=..).

Используется голый jdbcTemplate. Все работает. Я проверил.
public class Journal {

    private Long id;
    private String title;
    private Date created;
    private String summary;

   ....
}

@Service
public class JournalService {

    static Logger log = LoggerFactory.getLogger(JournalService.class);

    @Autowired
    JdbcTemplate jdbcTemplate;

    public void insertData() {
        log.info("> Table creation");
        try {
            jdbcTemplate.execute("DROP TABLE JOURNAL");
        } catch (BadSqlGrammarException ex) {}
        jdbcTemplate.execute("CREATE TABLE JOURNAL(id SERIAL, title VARCHAR(255), summary VARCHAR(255), created TIMESTAMP)");
        log.info("> Inserting data...");
        jdbcTemplate.execute("INSERT INTO JOURNAL(title,summary,created) VALUES('Get to know Spring Boot','Today I will learn Spring Boot', '2016-01-01 00:00:00.00')");
        jdbcTemplate.execute("INSERT INTO JOURNAL(title,summary,created) VALUES('Simple Spring Boot Project','I will do my first Spring Boot project','2016-01-02 00:00:00.00')");
        jdbcTemplate.execute("INSERT INTO JOURNAL(title,summary,created) VALUES('Spring Boot Reading','Read more about Spring Boot', '2016-02-01 00:00:00.00')");
        jdbcTemplate.execute("INSERT INTO JOURNAL(title,summary,created) VALUES('Spring Boot in the Cloud','Learn Spring Boot using Cloud Foundry','2016-01-01 00:00:00.00')");
        log.info("> Done.");
    }

    public List<Journal> findAll() {
        List<Journal> entries = new ArrayList<>();
        jdbcTemplate.query(
                "SELECT * FROM JOURNAL",
                new Object[]{},
                (rs, row) -> new Journal(
                        rs.getLong("id"),
                        rs.getString("title"),
                        rs.getString("summary"),
                        new Date(rs.getTimestamp("created").getTime())))
                .forEach(entry -> entries.add(entry));
        return entries;
    }
}
13 ноя 20, 00:01    [22231168]     Ответить | Цитировать Сообщить модератору
 Re: Немного SQL перенести на хибер  [new]
mayton
Member

Откуда: loopback
Сообщений: 49762
Пофиксил @Deprecated

    public Stream<Journal> findAll() {
        return jdbcTemplate.query("SELECT * FROM JOURNAL",
                (ResultSet rs, int rowNum) -> {
                    return new Journal(
                            rs.getLong("id"),
                            rs.getString("title"),
                            rs.getString("summary"),
                            new Date(rs.getTimestamp("created").getTime()));
                }).stream();
    }
13 ноя 20, 00:24    [22231176]     Ответить | Цитировать Сообщить модератору
 Re: Немного SQL перенести на хибер  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 6525
mayton,
Тоже неплохо.
Вообще без хибера))) и forEach это считай for по jdbc с формированием сразу json)))
Object то нафига нужен.
13 ноя 20, 07:40    [22231212]     Ответить | Цитировать Сообщить модератору
 Re: Немного SQL перенести на хибер  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 6525
mayton
Пофиксил @Deprecated

    public Stream<Journal> findAll() {
        return jdbcTemplate.query("SELECT * FROM JOURNAL",
                (ResultSet rs, int rowNum) -> {
                    return new Journal(
                            rs.getLong("id"),
                            rs.getString("title"),
                            rs.getString("summary"),
                            new Date(rs.getTimestamp("created").getTime()));
                }).stream();
    }
а это уже как шарпе)
13 ноя 20, 07:41    [22231213]     Ответить | Цитировать Сообщить модератору
 Re: Немного SQL перенести на хибер  [new]
вадя
Member

Откуда: Екатеринбург
Сообщений: 18324
Zzz79
но как я вижу тут таблица user взята в кавычки
а в коде java user полсьвечивается как ключевое слово - и хз что делать
ну а поставит кавычки слабо?
public List<Object[]> unsuberList(Long pollId, Timestamp froms, Timestamp tos) {
        Query query = em.createNativeQuery("select me.email,me.unsubscribe_date,pc.poll_id " +
                "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 = ?1 " +
                "and me.unsubscribed = 'true'" +
                "and me.unsubscribe_date between ?2 and ?3");

        query.setParameter(1, pollId);
        query.setParameter(2, froms);
        query.setParameter(3, tos);
        return query.getResultList();
13 ноя 20, 10:25    [22231266]     Ответить | Цитировать Сообщить модератору
 Re: Немного SQL перенести на хибер  [new]
Zzz79
Member

Откуда:
Сообщений: 1005
Kachalov
Zzz79
да не надо мне это еще вам говорю раз,достану я руками

- можно без рук, вот не самый элегантный способ (вроде можно и получше, но сейчас не могу найти в проектах), но точно работающий:
@Repository
public class NativeRepository {
    
    @Autowired
    private EntityManager entityManager;

    public List<PersonDTO> myNativeQuery() {
        Query query = entityManager.createNativeQuery("select ID, EMAIL from PERSON");
        return query.unwrap(org.hibernate.Query.class)
                .setResultTransformer(Transformers.aliasToBean(PersonDTO.class))
                .getResultList();
    }
    
    public static class PersonDTO {
       
        private BigInteger ID;
        private String EMAIL;
        
        @Override
        public String toString() {
            return ID + "\t" + EMAIL;
        }
        
    }
    
}


вот это хороший вариант,только тут вопрос поля выборки и поля класса должны по имени совпадать или же они мапятся по расположению?
13 ноя 20, 10:43    [22231275]     Ответить | Цитировать Сообщить модератору
 Re: Немного SQL перенести на хибер  [new]
Zzz79
Member

Откуда:
Сообщений: 1005
Всем спасибо за участие,
теперь вторая часть задачи

мне нужно построить Query builder ,который в зависимости от наличия ,осутсвия условий будет менять сам запрос

сам Query сейчас выглядит вот так

Query query = em.createNativeQuery("select me.email,me.unsubscribe_date,pc.poll_id " +
                "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 p.id = ?1 " +
                "where s.id = ?2 " +
                "and me.unsubscribed = 'true'" +
                "and me.unsubscribe_date between ?3 and ?4");

        query.setParameter(1, pollId);
        query.setParameter(2, spaceId);
        query.setParameter(3, fr);
        query.setParameter(3, to);

так вот у меня добавляются условия

1.может быть задан pollId - тогда отдаем все опросы с этим id,если pollId =null,то тогда этот фильтр убираем

2.так же есть два времени от и до
может быть только от - тогда надо все записи до этой даты,
моджет быть задано только до- тогда все записи до этой даты
если не задано ни от ни до - то убрать фильтр по времни

если кто то делал такие QueryBuilders покажите пож пример на основе моего примера пожалуйста.
13 ноя 20, 11:00    [22231280]     Ответить | Цитировать Сообщить модератору
 Re: Немного SQL перенести на хибер  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 6525
Zzz79
по имени совпадать
странный вопрос для sql прогера.
Напиши mail as myNameField
Это вообще правила хорошего тона
13 ноя 20, 11:04    [22231285]     Ответить | Цитировать Сообщить модератору
 Re: Немного SQL перенести на хибер  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 6525
Zzz79
теперь вторая часть задачи
сам придумал. И где такие задачи то берем?
13 ноя 20, 11:06    [22231287]     Ответить | Цитировать Сообщить модератору
 Re: Немного SQL перенести на хибер  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 6525
Zzz79,
Отдельный топик делай
13 ноя 20, 11:07    [22231288]     Ответить | Цитировать Сообщить модератору
 Re: Немного SQL перенести на хибер  [new]
Kachalov
Member

Откуда: Москва
Сообщений: 5790
Zzz79
тут вопрос поля выборки и поля класса должны по имени совпадать или же они мапятся по расположению?
- конечно по имени, если не удобно используйте алиасы в SQL-запросе

Zzz79
мне нужно построить Query builder ,который в зависимости от наличия ,осутсвия условий будет менять сам запрос

- чем дальше в лес тем очевидней, что из-за отсутствия нормальной объектой модели (понятно, что лень рисовать сущности и связи между ними, но есть инструменты которые генерят нужный код по реляционной модели в БД) возникают все новые и новые сложности. Сначала был вопрос - как микроскопом гвозди заколачивать, теперь - как микроскопом дрова колоть.
13 ноя 20, 11:14    [22231296]     Ответить | Цитировать Сообщить модератору
 Re: Немного SQL перенести на хибер  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 6525
Kachalov,
+1
13 ноя 20, 11:29    [22231311]     Ответить | Цитировать Сообщить модератору
 Re: Немного SQL перенести на хибер  [new]
mayton
Member

Откуда: loopback
Сообщений: 49762
Стас ну что? Получилось?
13 ноя 20, 11:44    [22231322]     Ответить | Цитировать Сообщить модератору
 Re: Немного SQL перенести на хибер  [new]
Zzz79
Member

Откуда:
Сообщений: 1005
mayton
Стас ну что? Получилось?

Да,вот сам запрос и обработка

@Service
public class UnsuberRepositoryCustomImpl implements UnsuberRepositoryCustom{

    @PersistenceContext
    private EntityManager em;

    @Override
    public List<Unsuber> unsuberList(Long spaceId, Long pollId, Timestamp fr, Timestamp to) {
        Query query = em.createNativeQuery("select me.email,me.unsubscribe_date,pc.poll_id " +
                "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 p.id = ?1 " +
                "where s.id = ?2 " +
                "and me.unsubscribed = 'true'" +
                "and me.unsubscribe_date between ?3 and ?4");

        query.setParameter(1, pollId);
        query.setParameter(2, spaceId);
        query.setParameter(3, fr);
        query.setParameter(3, to);
        query.unwrap(org.hibernate.Query.class)
                .setResultTransformer(Transformers.aliasToBean(Unsuber.class));
        return query.getResultList();



    }
}

на выходе получаем лист ансабов.
Теперь это же самое нужно изменить - тоесть сделать QueryBuilder,который будет добавлять/убирать фильтры в этот запрос в зависимости от того,какие входные значения будут
а они таковы
1.может быть задан pollId - тогда отдаем все опросы с этим id,если pollId =null,то тогда этот фильтр убираем

2.так же есть два времени от и до
может быть только от - тогда надо все записи до этой даты,
моджет быть задано только до- тогда все записи до этой даты
если не задано ни от ни до - то убрать фильтр по времни
13 ноя 20, 13:44    [22231387]     Ответить | Цитировать Сообщить модератору
 Re: Немного SQL перенести на хибер  [new]
Zzz79
Member

Откуда:
Сообщений: 1005
Kachalov
Zzz79
тут вопрос поля выборки и поля класса должны по имени совпадать или же они мапятся по расположению?
- конечно по имени, если не удобно используйте алиасы в SQL-запросе

Zzz79
мне нужно построить Query builder ,который в зависимости от наличия ,осутсвия условий будет менять сам запрос

- чем дальше в лес тем очевидней, что из-за отсутствия нормальной объектой модели (понятно, что лень рисовать сущности и связи между ними, но есть инструменты которые генерят нужный код по реляционной модели в БД) возникают все новые и новые сложности. Сначала был вопрос - как микроскопом гвозди заколачивать, теперь - как микроскопом дрова колоть.

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

да да знаю что это бред( но тут вся задача целиком бред -переписать внешнее апи ,так чтобы клиенты не заметили,но при этом в старом сервисе совсем другая модель данных,другая база( вообще носикуель) ,другой яп ( node.js)
-тоесть если юзер делал запрос и получал что то - то и сейчас должен получить все 1 в 1 - так как наш апи плотно интегрирован в клиентские сервисы-об этот судя по всему никто не думал,когда клепали новую модель данных- теперь вот строим костыли из 20 джоинов,но это все лирика) задача поставлена - моя обязанность ее исполнить.
13 ноя 20, 13:51    [22231393]     Ответить | Цитировать Сообщить модератору
 Re: Немного SQL перенести на хибер  [new]
Zzz79
Member

Откуда:
Сообщений: 1005
PetroNotC Sharp
Zzz79,
Отдельный топик делай

а зачем? тема соотвествует описанию- ,QueryBuilder делать буду)
13 ноя 20, 13:53    [22231396]     Ответить | Цитировать Сообщить модератору
 Re: Немного SQL перенести на хибер  [new]
mayton
Member

Откуда: loopback
Сообщений: 49762
Zzz79
PetroNotC Sharp
Zzz79,
Отдельный топик делай

а зачем? тема соотвествует описанию- ,QueryBuilder делать буду)

У тебя-ж куплена лицензия на JOOQ. Вот и бери его.
13 ноя 20, 14:19    [22231416]     Ответить | Цитировать Сообщить модератору
 Re: Немного SQL перенести на хибер  [new]
Zzz79
Member

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

а зачем? тема соотвествует описанию- ,QueryBuilder делать буду)

У тебя-ж куплена лицензия на JOOQ. Вот и бери его.

я же на другую работу перешел ) тут нет жука ,только хибер
13 ноя 20, 14:25    [22231423]     Ответить | Цитировать Сообщить модератору
 Re: Немного SQL перенести на хибер  [new]
mayton
Member

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

У тебя-ж куплена лицензия на JOOQ. Вот и бери его.

я же на другую работу перешел ) тут нет жука ,только хибер

Посмотри вот этот проект http://www.querydsl.com/

Тут по идее бесплатная лицензия на все диалекты SQL.
13 ноя 20, 14:28    [22231427]     Ответить | Цитировать Сообщить модератору
 Re: Немного SQL перенести на хибер  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 6525
Zzz79
PetroNotC Sharp
Zzz79,
Отдельный топик делай

а зачем? тема соотвествует описанию- ,QueryBuilder делать буду)
если соответствует, тогда 3-4 отдельных строки запро а под эти варианты. Че тут думать.
13 ноя 20, 14:29    [22231428]     Ответить | Цитировать Сообщить модератору
 Re: Немного SQL перенести на хибер  [new]
mayton
Member

Откуда: loopback
Сообщений: 49762
PetroNotC Sharp
Zzz79
пропущено...

а зачем? тема соотвествует описанию- ,QueryBuilder делать буду)
если соответствует, тогда 3-4 отдельных строки запро а под эти варианты. Че тут думать.

Для диапазонных запросов я иногда выкручивался так. Я предполагал что тип данных
мы знаем. Допустим это date (Oracle). В нем мы знаем конкретную константу для
MIN_DATE/MAX_DATE.

И если ищем от одной даты до бесконечности

SELECT * FROM EMP WHERE hiredate >= to_date('1995-01-02');


Тогда запрос от одной даты до бесконечности можно переписать так.

SELECT * FROM EMP WHERE hiredate between to_date('1995-01-02') and to_date('9999-01-01')


Тогда в шаблонном варианте запрос ВСЕГДА будет такой. С bind-variables:

SELECT * FROM EMP WHERE hiredate between ? and ?


И мне не нужен билдер.

Это работает только для чисел и дат которые имеют известные лимиты.
13 ноя 20, 15:04    [22231449]     Ответить | Цитировать Сообщить модератору
 Re: Немного SQL перенести на хибер  [new]
вадя
Member

Откуда: Екатеринбург
Сообщений: 18324
Zzz79,

что за субд?
Zzz79
1.может быть задан pollId - тогда отдаем все опросы с этим id,если pollId =null,то тогда этот фильтр убираем

where p.id= if(ifnull(pollId ),p.id,pollId )
13 ноя 20, 15:29    [22231473]     Ответить | Цитировать Сообщить модератору
 Re: Немного SQL перенести на хибер  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 6525
mayton,
Ну и в оракле есть хитрость с OR.
Нужно в where добавить
and (:param1 is null) OR (field = :param1)

Хотя к вопросу автора это не относится.
Он может число запросов делать под число вариантов.
13 ноя 20, 15:31    [22231474]     Ответить | Цитировать Сообщить модератору
 Re: Немного SQL перенести на хибер  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 6525
Zzz79
тогда этот фильтр убираем
тогда строку литерал подставляем другую)))
13 ноя 20, 15:34    [22231475]     Ответить | Цитировать Сообщить модератору
 Re: Немного SQL перенести на хибер  [new]
Leonid Kudryavtsev
Member

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

Для ситуаций "1.может быть задан pollId...
2.так же есть два времени от и до..."

попытка собрать все в один универсальный запрос хоть и возможна, но может приводить к крайне не эффективным планам

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

note:
например оптимизатор умеет подглядывать в bind переменные, когда подглядывает успешно - все летает, а если "не получилось", то весь пром сервер встает колом. Такую ситуацию воспроизвести на тестовом стенде и найти проблему, та еще радость.

mayton

Это работает только для чисел и дат которые имеют известные лимиты.

NVL никто не отменял. Т.ч. это работать для чего хочешь )))
Дурное дело не хитрое
13 ноя 20, 15:38    [22231477]     Ответить | Цитировать Сообщить модератору
 Re: Немного SQL перенести на хибер  [new]
mayton
Member

Откуда: loopback
Сообщений: 49762
PetroNotC Sharp
mayton,
Ну и в оракле есть хитрость с OR.
Нужно в where добавить
and (:param1 is null) OR (field = :param1)

Хотя к вопросу автора это не относится.
Он может число запросов делать под число вариантов.

Впервые этот алгоритм я применил не в Dbms а в Java для формирования
открытых диапазонов. Типа (-бесконечность до константа) или (константа до плюс бесконечность)
или вообще подходит любая точка на интервале.

Изначально алгоритм содержал много if-s.

После замены null на +/- Long integer код реально упростился и логика
стала плоской.

Было как то так. Здесь предполагалось что если bounds не указаны то интервал открытый.
Типа maxTim == null - услуга активирована и еще предоставляется.

booleas checkIfPointInRange(long timePoint, Long minTime, Long maxTime) {
   if (minTim == nul) { .....
   if (maxTime == null) { ...
   if (maxTime == null && minTime == null) { ...
    ......
} 


Я свел это к
booleas checkIfPointInRange(long timePoint, Long minTime, Long maxTime) {
   return timePoint >= minTime == null ? Long.MIN : minTime && 
             timePoint <= maxTime == null ? Long.MAX : maxTime;
} 
13 ноя 20, 15:41    [22231478]     Ответить | Цитировать Сообщить модератору
 Re: Немного SQL перенести на хибер  [new]
mayton
Member

Откуда: loopback
Сообщений: 49762
Как вы понимаете в SQL проверка с NULL дает false и поэтому SQL-машина толерантна
к таким проверкам, а в Java вызывает NPE поэтому ее надо было явно отработать.
13 ноя 20, 15:44    [22231480]     Ответить | Цитировать Сообщить модератору
 Re: Немного SQL перенести на хибер  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 6525
mayton,
Угу.
Я к тому что sql и rdbms знать надо.
А тс все уходит от этого. Даже поле в запросе переименовать не может.
13 ноя 20, 15:51    [22231485]     Ответить | Цитировать Сообщить модератору
 Re: Немного SQL перенести на хибер  [new]
Leonid Kudryavtsev
Member

Откуда:
Сообщений: 9249
Может я туплю, но зачем поля в запросе переименовывать?
За 10 лет, что я с Hibernate не работал, его настолько испортили?
13 ноя 20, 15:58    [22231493]     Ответить | Цитировать Сообщить модератору
 Re: Немного SQL перенести на хибер  [new]
Leonid Kudryavtsev
Member

Откуда:
Сообщений: 9249
Вообще вся тема (с самого начала) напоминает обсуждение "куда в электрическую лампочку керосин наливать?" )))
13 ноя 20, 16:01    [22231498]     Ответить | Цитировать Сообщить модератору
 Re: Немного SQL перенести на хибер  [new]
mayton
Member

Откуда: loopback
Сообщений: 49762
Да в любых билдерах и SQL запросах я всегда рекомендую оборачивать в двойные кавычки все названия.

Тоесть такой вариант:

SELECT userId FROM x


потенциально вызывает у DBMS матчинг со всеми полями похожими на

USERID,
userId,
userid
UserId
...


Нежданчик может прилететь когда мы как в natural join соединяем две таблицы
и возникает конфликт имен.

Чтобы рантайме билдера никогда такого не произошло надо делать так

SELECT "userId" FROM "X"


Могут быть нюансы зависящие от Dbms. Например Postgres в подзапросах требует указания алиаса к
подзапросу. Oracle вроде не требует.

Проблема может быть с длиной идентификаторов. Oracle ограничивает их до 30 символов.
MSSQL кажется - длинее. Когда я мигрировал одну CRM c MS на Оракл мне пришлось сильно
курочить и изменять T-SQL/PL-SQL пакеты чтобы компилляция в Оракле прошла без ошибок.

Тоесть выводы такие. Билдер не должен быть сферическим билдером в вакууме.
Он должен наследовать целевой диалект SQL. Он должен знать рулы и синтаксис.

Типа

builder = Zzz79FuckenSQLBuilderFactory.forDialect(POSTGRES).createBuilder();


И с этого момента пустая строка и NULL - различаются. А в Оракле было-бы наоборот.
13 ноя 20, 16:01    [22231500]     Ответить | Цитировать Сообщить модератору
 Re: Немного SQL перенести на хибер  [new]
mayton
Member

Откуда: loopback
Сообщений: 49762
По поводу таблицы "X". Для Оракла. Любой идентификатор введенный без кавычек - всегда апперкейсится.
Тоесть таблица
create table x (...)

Будет иметь название икс-большое.

Если при создании ее кавычить то будет учтён точно тот регистр который указал разработчик.

Вобщем Оракл ведет себя с идентификаторами примерно как язык Паскаль.

Для других DBMS я не помню как - надо проверять.
13 ноя 20, 16:04    [22231503]     Ответить | Цитировать Сообщить модератору
 Re: Немного SQL перенести на хибер  [new]
Leonid Kudryavtsev
Member

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

После фразы "потенциально вызывает у DBMS матчинг со всеми полями похожими на" мне реально стало плохо. Такой жутчайшей дичи от Вас не ожидал. Отпустило только когда дочитал до "natural join" )))

Может надо не "рекомендую оборачивать в двойные кавычки", а попытаться как-то настроить SVN, что бы он код содержащий слова "natural join" отказывался в проект комитет?
13 ноя 20, 16:08    [22231508]     Ответить | Цитировать Сообщить модератору
 Re: Немного SQL перенести на хибер  [new]
mayton
Member

Откуда: loopback
Сообщений: 49762
Я natural join просто привел в качестве примера. Это зло и я его никогда в жизни не использовал.

Можно заменить на "join" с таблицей содержащей похожие поля.

Да и алиасы делать всегда. Билдеру - пофиг сколько букв писать а нам оно так спокойнее жить будет.

Если в пятницу - релиз
13 ноя 20, 16:13    [22231512]     Ответить | Цитировать Сообщить модератору
 Re: Немного SQL перенести на хибер  [new]
Leonid Kudryavtsev
Member

Откуда:
Сообщений: 9249
mayton
Любой идентификатор введенный без кавычек - всегда апперкейсится.

+
mayton

Для других DBMS я не помню как - надо проверять.


IMHO для большинства DBMS аналогично.

Вроде в Delphi когда-то встречал наоборот, lowercase'лось. Но я не уверен, была ли это проблема в DBMS, а не в среде/драйверах/прокладках посередине.

Лично я считаю, что " (как и natural join) зло.

Разнобой upper/lower мало чего дает для читаемости, но потенциальный источник скрытых проблем/ошибок. Не говоря о том, что ряд сред вообще ничего про " не знают и такой вакханалии с upper/lower не позволяют. (насколько я помню, в ForPro все было регистронезависимым)

IMHO Создав таблицу, где будет два разных поля "X" и "x" можно еще долго после увольнения приносит радость потомкам и коллегам )))
13 ноя 20, 16:18    [22231520]     Ответить | Цитировать Сообщить модератору
 Re: Немного SQL перенести на хибер  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 6525
mayton,
Вообще не использую кавычки.
Пиши userId правильно.
В java же тоже регистр имеет значение.
13 ноя 20, 16:20    [22231523]     Ответить | Цитировать Сообщить модератору
 Re: Немного SQL перенести на хибер  [new]
mayton
Member

Откуда: loopback
Сообщений: 49762
Есть некий code style для баз данных. У нас джавистов - кемал-кейс. У базовиков даш-стайл.

Вот кидаю огрызок своего кода. Конвертит имена в даш-стайл. Это если надо делать авто-генерацию
таблиц и полей. Назад - аналогично.


    ....
    private static Set<String> sqlReservedWords = Sets.newHashSet("type", "table", "view", "from", "to", "rank");

    @Nonnull
    public static String filterSQLWordsAndDashStyle(@Nonnull String arg) {
        if (sqlReservedWords.contains(arg.toLowerCase())) {
            return "\"" + arg.toUpperCase() + "\"";
        } else {
            String text = CaseFormat.UPPER_CAMEL.to(CaseFormat.UPPER_UNDERSCORE, arg);
            return replace(text, "-", "_");
        }
    }


    @Test
    public void test() {
        assertEquals("ID_USER", Utils.filterSQLWordsAndDashStyle("idUser"));
    }
13 ноя 20, 16:34    [22231539]     Ответить | Цитировать Сообщить модератору
 Re: Немного SQL перенести на хибер  [new]
mayton
Member

Откуда: loopback
Сообщений: 49762
Импорты забыл.

import com.google.common.base.CaseFormat;
import static org.apache.commons.lang3.StringUtils.replace;


Сообщение было отредактировано: 13 ноя 20, 16:37
13 ноя 20, 16:41    [22231549]     Ответить | Цитировать Сообщить модератору
 Re: Немного SQL перенести на хибер  [new]
Leonid Kudryavtsev
Member

Откуда:
Сообщений: 9249
Единственная система где сталкивался с Hibernate, Oracle СоСИеБи. (CC&B Customer Care and Billing)

Hibernate допускает маппинг имен. Там этим пользовались в полный рост. У всех полей было как минимум ТРИ разных наименования для Hibernate.

1. Наименования в классе Java (entity, DTO)
2. Наименования в HQL запросах
3. Наименование 8-10 символов в реальной таблице

Все они были разные! Вот блин, перфекционисты. Хотели что бы везде названия под "стандарт написания кода" для языка подпадало.

Оно конечно выглядит красиво, если с этим не работать. Одно плохо. Т.к. это биллинг там дофига дат. Поля для которых, как не удивительно, называются.. которые называются... DATE !!! и что-то еще )))

В общем, понять, (пример чисто из головы, системы под рукой нет) какое же конкретно поле в таблице DATE_B или DATE_S соответствует полю BillStartDate из HQL, была увлекательная шарада, полная искренней радости, минут на 20-30 ))) после чего оказывалось, что это поле DATE_A (!) и у этого поля название в Java DTO BillStartAccountingDate )))

Ну и в Cobol тоже, свои наименования (обычно совпадали с именем в БД, во времена Cobol выдумщиков было поменьше)
13 ноя 20, 16:44    [22231551]     Ответить | Цитировать Сообщить модератору
 Re: Немного SQL перенести на хибер  [new]
mayton
Member

Откуда: loopback
Сообщений: 49762
Leonid Kudryavtsev, я как-то имел дело с дата-аналитикой по истории торговых индексов
которые трекались где-то аж с 1970 годов.

Вобщем на вход нам отгружали CSV таблицу в которой Over 1500 колонок.
Разумеется у них названия были уе6ансkие. Типа FX12HG1, FX12HG2, .... e.t.c.

И после того как эти тыщи колонок были загружены мы (отдельной задачей)
конфигурировали для них мета-дату. Это отдельная задача уствновки связи
между бизнесовым индексом и целевым полем в таблице. Еще были сложности
что поле могло иметь множитель. Быть в разных типах данных. И т.д.

Вобщем этой проблемой были заняты на 90% дата-аналитики а мы только
обеспечивали техническую часть плтаформы.

В обычную DBMS эти данные грузить невыгодно. Неэффективно исопльзуется блок.
Одна строчка бизнес инфы может быть реально больше 4к а выборка обычно идет
по 5-10 колонок для рисования графиков в вебе. И наперед знать какие колонки
захочет бизнес - невозможно.

Там мы юзали Apache ORC вместо Dbms.

И представте себе Hibernate Entity в которой 1500 полей.... Ахаха
13 ноя 20, 16:55    [22231562]     Ответить | Цитировать Сообщить модератору
 Re: Немного SQL перенести на хибер  [new]
Basil A. Sidorov
Member

Откуда:
Сообщений: 10760
mayton
SELECT userId FROM x
потенциально вызывает у DBMS матчинг со всеми полями похожими на
... бред сумасшедшего.
Не знаю как там в NoSQL и прочем креативном базостроении, но "классический" SQL игнорирует регистр. И это - стандарт.
Взять имя поля в кавычки для человека - должно иметь веское обоснование.
А вот сделать псевдоним (имя псевдоним) - полезная привычка. Главное - не путать её с вредной привычкой "всё в кавычках и с постоянным уточнением таблицы".
13 ноя 20, 17:01    [22231563]     Ответить | Цитировать Сообщить модератору
 Re: Немного SQL перенести на хибер  [new]
Leonid Kudryavtsev
Member

Откуда:
Сообщений: 9249
а уж какие там отчеты были (раз речь зашла о датах)... сказка
+

Например отчет показывающий движение средств за период (за месяц)

Параметры отчета:

1. Дата начала и дата окончания периода для поиска счетов
2. Дата начала и дата окончания периода для поиска оплат
(оплаты идут с задержкой. Поэтому периоды учета у них не совпадают. Выставленные счета за март, это счета с 01.03 по 31.03, а оплаты за март, это оплаты за 10.03-09.04)
3. Поскольку иногда нужно искать не по дате счета, а по дате фактически оказанной услуге.
То еще дата начала окончания и дата окончания периода для поиска строк счета
(а вся красота заключается в том, что в строках счета и так уже период! т.к. "услуга такая-то за 15.03.2010 - 30.04.2010)
4.-5. ну и еще какие-то периоды, в меру фантазии аналитика )))

Ну и да ))) разумеется большинство этих параметров отчета может быть, а может и не быть )))
Представить все прелести результирующего SQL запроса - тяжело, это надо было видеть.
Дата на дате и Bettween'ом друг друга погоняют.

Повторюсь. Это элементарнийший отчет, что-то типа "движение денег за март". Бл$%^. Там должен быть один параметр, месяц за который строим отчет! Март! Все остальная порнография родилась исключительно в умах аналитиков.

А потом вопросы:
а почему оно так медленно работает
а почему оно данные показывает не правильно. Почему счет с услугой за 15.03.2010 - 30.04.2010 не попал в отчет, хотя мы указывали в параметрах отчета 20.03.2010 - 31.03.2010 )))

и так далее.... я как только ТЗ на отчет увидел, тут же было понятно, что это работать не может в принципе
===

Там еще одна эпическая задача была, которую регулярно просили аналитики.

ТЗ:
нужно сделать массовое удаление счетов
Описание бизнес процесса:
заказчик формирует в системе счета (12 штук!) на год вперед. В конце года, их ему нужно удалить и сформировать новый счет.

В это задачи было все великолепно.

1) Система буржуйская. Если счет проведен по системе и период закрыт - счет удалить уже не возможно. Он проведен. Удалить можно только напрямую delete из базы. Вот такие плохие буржуйские системы

note:
Хотя даже с точки зрения российской скрепности - он должен включатся в книге покупок-продаж, книги раз в квартал сдается в налоговую, что мать вашу и как Вы через год удалять собрались?

2) Создать счет в системе достаточно не просто. Для этого нужно приложить определенные усилия, нажимать на кнопочки. Создать 12 счетов на год вперед.... не сильно быстро, работа видна.

Задача так и не была решена. Т.к. программисты(я), гады, перед тем как делать задавал совершенно глупый вопрос: нафига? Зачем это нужно?

Сильно я сомневаюсь, что у заказчика сотрудникам настолько заняться нечем, что он безделья они начинают счета на год вперед выставлять..... что бы их потом просто удалить )))

За > 4 года, что длился проект, регулярно приходили аналитики и приносили ТЗ на данную задачу. Им задавался вопрос... они говорили: хорошо, мы уточним у заказчика и уходили... и через полгода весь процесс начинался заново (приносили ТЗ, задавался вопрос, уходили уточнять....)



Вобщем на вход нам отгружали CSV таблицу в которой Over 1500 колонок.
Разумеется у них названия были уе6ансkие. Типа FX12HG1, FX12HG2, .... e.t.c.


Сейчас регулярно вижу Excel таблицу с 97 полями. Используется для обмена данных. Это жесть.

Зато все в одной таблице. Люди, кони, квартиры, деньги, показания счетчиков.... про "залпы тысячи орудей" не уверен, возможно тоже есть )))

Одно плохо. Т.к. в одной квартире может быть несколько жильцов (коммунальные квартиры), мало того, в одной квартире может быть одновременно несколько разных счетчиков (например несколько стояков с холодной водой). То понять сколько же денег должен заплатить человек и какие же реально показания приборов учета он подал (т.к. они будут повторяться столько раз, сколько жителей в коммуналке) - иногда крайне затруднительно.

В общем, табличка хорошая, полей много, счастья приносит много. Все счастливы. Девочка которая с ней регулярно работает и разбирается, точно счастлива ))) не было бы такой хорошей таблички с 97 полями, у нее не было бы работы )))
13 ноя 20, 17:30    [22231590]     Ответить | Цитировать Сообщить модератору
 Re: Немного SQL перенести на хибер  [new]
вадя
Member

Откуда: Екатеринбург
Сообщений: 18324
если подходить более правильно
то имя поля в запросе должно содержать (через точку) имя схемы, имя таблицы, имя поля в таблице, ну и алиас для удобства
тогда не потребуются кавычки.

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

Откуда:
Сообщений: 1005
вадя
Zzz79,

что за субд?
Zzz79
1.может быть задан pollId - тогда отдаем все опросы с этим id,если pollId =null,то тогда этот фильтр убираем

where p.id= if(ifnull(pollId ),p.id,pollId )

psql
13 ноя 20, 19:07    [22231661]     Ответить | Цитировать Сообщить модератору
 Re: Немного SQL перенести на хибер  [new]
вадя
Member

Откуда: Екатеринбург
Сообщений: 18324
Zzz79
psql

тогда
where p.id= if(ifnull(pollId ),p.id,pollId )

считай псевдокодом, а логика, я надеюсь, понятна.
13 ноя 20, 19:10    [22231663]     Ответить | Цитировать Сообщить модератору
 Re: Немного SQL перенести на хибер  [new]
Zzz79
Member

Откуда:
Сообщений: 1005
вадя
Zzz79
psql

тогда
where p.id= if(ifnull(pollId ),p.id,pollId )

считай псевдокодом, а логика, я надеюсь, понятна.

не могу врубиться в этот код
у меня ситуация такая если не на вход не поступил pollId я должен убрать фильтр where pollId=
13 ноя 20, 19:13    [22231666]     Ответить | Цитировать Сообщить модератору
 Re: Немного SQL перенести на хибер  [new]
graycode
Member

Откуда:
Сообщений: 461
Basil A. Sidorov
Взять имя поля в кавычки для человека - должно иметь веское обоснование.

В СУБД существуют зарезервированные слова, в частности в его запросе кто то додумался назвать таблицу user, вот в таких случаях и применяют двойные кавычки, кроме того поле или таблица имя которых указали в кавычках как правило становятся регистрозависимыми, естественно это плохая практика, но раз система позволяет всегда найдется тот кто так сделает.
13 ноя 20, 19:15    [22231669]     Ответить | Цитировать Сообщить модератору
 Re: Немного SQL перенести на хибер  [new]
graycode
Member

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

разбей запрос на отдельные части, части FROM и WHERE формируй в зависимости от условий, часть из этих секций постоянная, часть добавляешь опционально, ну и у тебя строки, у тебя есть if, вперед и с песней по завершении формирования отдельных частей сливаешь их в одну строку.
13 ноя 20, 19:19    [22231671]     Ответить | Цитировать Сообщить модератору
 Re: Немного SQL перенести на хибер  [new]
Zzz79
Member

Откуда:
Сообщений: 1005
graycode
Basil A. Sidorov
Взять имя поля в кавычки для человека - должно иметь веское обоснование.

В СУБД существуют зарезервированные слова, в частности в его запросе кто то додумался назвать таблицу user, вот в таких случаях и применяют двойные кавычки, кроме того поле или таблица имя которых указали в кавычках как правило становятся регистрозависимыми, естественно это плохая практика, но раз система позволяет всегда найдется тот кто так сделает.

ну вот я как раз таки закостыливал какого то мудака,который назвал таблицу user,мало того там еще есть таблица space ,которая воспринимается как ключевое слово,но отрабатывает и без кавычек

самое смешное у ребят сущность EUser @Table( name="user")
я думаю блеат это такая шутка для тех кто будет с хибером потом секс иметь
13 ноя 20, 19:20    [22231672]     Ответить | Цитировать Сообщить модератору
 Re: Немного SQL перенести на хибер  [new]
Zzz79
Member

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

разбей запрос на отдельные части, части FROM и WHERE формируй в зависимости от условий, часть из этих секций постоянная, часть добавляешь опционально, ну и у тебя строки, у тебя есть if, вперед и с песней по завершении формирования отдельных частей сливаешь их в одну строку.

а разве нет такого инстумента как QueryBuilder?
ну и по строкам- уменя же запрос с биндингом- 4 бинда ,прокатит ли такое?

вот запрос сам
   @Override
    public List<UnsuberResponse> unsuberList(Long pollId, Long spaceId, Timestamp fr, Timestamp to) {
        Query query = em.createNativeQuery("select me.email as \"email\",me.unsubscribe_date as \"date\",pc.poll_id as \"poll\"" +
                "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 = ?1 " +
                "and  p.id = ?2 " +
                "and me.unsubscribed = 'true'" +
                "and me.unsubscribe_date between ?3 and ?4");

        query.setParameter(1, spaceId);
        query.setParameter(2, pollId);
        query.setParameter(3, fr);
        query.setParameter(4, to);
        query.unwrap(org.hibernate.Query.class)
                .setResultTransformer(Transformers.aliasToBean(UnsuberResponse.class));
        return query.getResultList();



    }
13 ноя 20, 19:23    [22231676]     Ответить | Цитировать Сообщить модератору
 Re: Немного SQL перенести на хибер  [new]
вадя
Member

Откуда: Екатеринбург
Сообщений: 18324
Zzz79
не могу врубиться в этот код
у меня ситуация такая если не на вход не поступил pollId я должен убрать фильтр where pollId=


where p.id= if(ifnull(pollId ),p.id,pollId )

если pollId = null, то if возвращает p.id
и получается where p.id=p.id - т.е. всегда true , что равносильно отсутствие фильтра по p.id
если pollId != null получается where p.id=pollId , т.е. фильтр по pollId



аналогично можно изменить и
me.unsubscribe_date between ?3 and ?4"
если ?3 =null использовать нулевую дату
если ?4 =null использовать дату следующего века

Сообщение было отредактировано: 13 ноя 20, 19:31
13 ноя 20, 19:32    [22231682]     Ответить | Цитировать Сообщить модератору
 Re: Немного SQL перенести на хибер  [new]
Zzz79
Member

Откуда:
Сообщений: 1005
вадя
Zzz79
не могу врубиться в этот код
у меня ситуация такая если не на вход не поступил pollId я должен убрать фильтр where pollId=


where p.id= if(ifnull(pollId ),p.id,pollId )

если pollId = null, то if возвращает p.id
и получается where p.id=p.id - т.е. всегда true , что равносильно отсутствие фильтра по p.id
если pollId != null получается where p.id=pollId , т.е. фильтр по pollId



аналогично можно изменить и
me.unsubscribe_date between ?3 and ?4"
если ?3 =null использовать нулевую дату
если ?4 =null использовать дату следующего века

но ты учитываешь что это java код в натив query,я понимаю может и не быть разницы с обычным зарпосом ,но так то разница есть,я вчера до ночи отладку синтаксиса делал
13 ноя 20, 19:40    [22231687]     Ответить | Цитировать Сообщить модератору
 Re: Немного SQL перенести на хибер  [new]
Zzz79
Member

Откуда:
Сообщений: 1005
сделаю небольшой оффтоп может куму поможет
так можено сделать мапинг на POJO
но есть несколько условий
анотация должна стоять над любым классом ,помеченным @Entity,не важно что вы мапите другой класс,но ентити менеджер отсканирует только тут
далее поля ,их нейминг и распооложение должны совпадать,
сама конструкция выглядит вот так

@SqlResultSetMapping(
        name = "fuck",
        classes = {
                @ConstructorResult(
                        columns = {
                                @ColumnResult(name = "email"),
                                @ColumnResult(name = "dates", type = Timestamp.class),
                                @ColumnResult(name = "poll", type = Long.class)
                        },
                        targetClass = UnsuberResponse.class
                )
        }
)
@Getter
@Setter
@NoArgsConstructor

@Entity
@Table(name = EPoll.TABLE)

@Where(clause = Tracked.NOT_DELETED)
@SQLDelete(sql = EPoll.SQL_DELETE, check = ResultCheckStyle.COUNT)
public final class EPoll extends Tracked {


обратите внимания анотированый класс не имеет никаого отношения к классу из ResulSetMaping

класс на который мапимся
@Data
public class UnsuberResponse {

    private String email;
    private Timestamp dates;
    private Long poll;


}


сам запрос

 @PersistenceContext
    private EntityManager em;

    @Override
    public List<UnsuberResponse> unsuberList(Long pollId, Long spaceId, Timestamp fr, Timestamp to) {
        Query query = em.createNativeQuery("select me.email as email,me.unsubscribe_date as dates,pc.poll_id as poll" +
                "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 = ?1 " +
                "and  p.id = ?2 " +
                "and me.unsubscribed = 'true'" +
                "and me.unsubscribe_date between ?3 and ?4","fuck");

        query.setParameter(1, spaceId);
        query.setParameter(2, pollId);
        query.setParameter(3, fr);
        query.setParameter(4, to);
        return query.getResultList();


может кому то будет полезным
13 ноя 20, 19:50    [22231691]     Ответить | Цитировать Сообщить модератору
 Re: Немного SQL перенести на хибер  [new]
вадя
Member

Откуда: Екатеринбург
Сообщений: 18324
Zzz79
но ты учитываешь что это java код в натив query,я понимаю может и не быть разницы с обычным зарпосом ,но так то разница есть,я вчера до ночи отладку синтаксиса делал
какая разница?
для нормальной работы - используй инструмент
https://www.devart.com/dbforge/postgresql/
потребуется 10 минут для полной отладки
13 ноя 20, 20:01    [22231692]     Ответить | Цитировать Сообщить модератору
 Re: Немного SQL перенести на хибер  [new]
Leonid Kudryavtsev
Member

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

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

всегда считал, что анотации это зло и глюка )))

в I-net'е еще описывают:

"...can be defined in a mapping XML file. The easiest way to do this is to use the default mapping file called orm.xml that will be automatically used, if it is added to the META-INF directory of the jar file."

<sql-result-set-mapping name="BookValueMappingXml">
    <constructor-result target-class="org.thoughts.on.java.jpa.value.BookValue">
        <column name="id" class="java.lang.Long"/>
        <column name="title"/>
        <column name="version" class="java.lang.Long"/>
        <column name="authorName"/>
    </constructor-result>
</sql-result-set-mapping>
13 ноя 20, 20:22    [22231701]     Ответить | Цитировать Сообщить модератору
 Re: Немного SQL перенести на хибер  [new]
Zzz79
Member

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

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

всегда считал, что анотации это зло и глюка )))

в I-net'е еще описывают:

"...can be defined in a mapping XML file. The easiest way to do this is to use the default mapping file called orm.xml that will be automatically used, if it is added to the META-INF directory of the jar file."

<sql-result-set-mapping name="BookValueMappingXml">
    <constructor-result target-class="org.thoughts.on.java.jpa.value.BookValue">
        <column name="id" class="java.lang.Long"/>
        <column name="title"/>
        <column name="version" class="java.lang.Long"/>
        <column name="authorName"/>
    </constructor-result>
</sql-result-set-mapping>


Не я поторопился - хибер дает ошибку
Could not locate appropriate constructor on class 


вообщем я ипользовал все доступные методы чтобы смапить resultSet на POJO

работает только вот этот варинат ( но он deprecated)
query.unwrap(org.hibernate.Query.class)
                .setResultTransformer(Transformers.aliasToBean(UnsuberResponse.class));


странно что хибер такое не предусмотрели - там же вручную мапится на раз два все
13 ноя 20, 20:25    [22231704]     Ответить | Цитировать Сообщить модератору
 Re: Немного SQL перенести на хибер  [new]
graycode
Member

Откуда:
Сообщений: 461
Zzz79
а разве нет такого инстумента как QueryBuilder?

QueryBuilder работает с произвольной строкой как у тебя или еще пару дней поразвлекаться хочется?))

вадя
потребуется 10 минут для полной отладки

Запрос у него был, он строку не мог привести к виду исходного запроса, кавычки расставить, пробелы и т.д...))

ЗЫ: с пробелами похоже до сих пор беда)))

Сообщение было отредактировано: 13 ноя 20, 20:57
13 ноя 20, 21:00    [22231721]     Ответить | Цитировать Сообщить модератору
 Re: Немного SQL перенести на хибер  [new]
Leonid Kudryavtsev
Member

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

....
ЗЫ: с пробелами похоже до сих пор беда)))

+100500 ))))
зачем нужны пробелы когда есть скобки )))
13 ноя 20, 21:16    [22231731]     Ответить | Цитировать Сообщить модератору
 Re: Немного SQL перенести на хибер  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 6525
Zzz79
может кому то будет полезным
вау!
Ты научился делать итоги в топиках?
Ты научился не терять цель?
Ты научился передавать свои знания другим а не просто болтать?
Апплодирую стоя!
13 ноя 20, 21:45    [22231740]     Ответить | Цитировать Сообщить модератору
 Re: Немного SQL перенести на хибер  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 6525
Zzz79
вадя
пропущено...

тогда
where p.id= if(ifnull(pollId ),p.id,pollId )


считай псевдокодом, а логика, я надеюсь, понятна.

не могу врубиться в этот код
у меня ситуация такая если не на вход не поступил pollId я должен убрать фильтр where pollId=

Тебе интересен секс с sql?
Если нет, то просто меняй запрос как переменную.
13 ноя 20, 21:50    [22231742]     Ответить | Цитировать Сообщить модератору
 Re: Немного SQL перенести на хибер  [new]
вадя
Member

Откуда: Екатеринбург
Сообщений: 18324
PetroNotC Sharp
Если нет, то просто меняй запрос как переменную.
как вариант

но ему не понравится куча таких запросов
13 ноя 20, 21:54    [22231748]     Ответить | Цитировать Сообщить модератору
 Re: Немного SQL перенести на хибер  [new]
Zzz79
Member

Откуда:
Сообщений: 1005
PetroNotC Sharp
Zzz79
может кому то будет полезным
вау!
Ты научился делать итоги в топиках?
Ты научился не терять цель?
Ты научился передавать свои знания другим а не просто болтать?
Апплодирую стоя!

я поторопился) то что я выдал за истину к сожалению не работает

@SqlReluslSetMapping к сожалению не может более мапить не @Entity - это судя по всему фича нового хибера,но хотя бы люди не будут время тратить свое,а так вообще не понятно зачем тогда нужна эта анотация ,если мы работаем с @Entity там напряму все мапится без каких либо проблем...
13 ноя 20, 22:52    [22231778]     Ответить | Цитировать Сообщить модератору
 Re: Немного SQL перенести на хибер  [new]
mayton
Member

Откуда: loopback
Сообщений: 49762
Лучшее - враг хорошего. Бери моё решение. Оно работает. Не циклись на JPA аннотациях.
13 ноя 20, 23:15    [22231791]     Ответить | Цитировать Сообщить модератору
 Re: Немного SQL перенести на хибер  [new]
Leonid Kudryavtsev
Member

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

@SqlReluslSetMapping к сожалению не может более мапить не @Entity - это судя по всему фича нового хибера....

есть ссылка на доку?
13 ноя 20, 23:24    [22231795]     Ответить | Цитировать Сообщить модератору
 Re: Немного SQL перенести на хибер  [new]
Zzz79
Member

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

@SqlReluslSetMapping к сожалению не может более мапить не @Entity - это судя по всему фича нового хибера....

есть ссылка на доку?

нет,но хибер не поддерживает ее ,если класс на который ты мапишься не сущность и собственно не обязан,так как эта анотация JPA,а хибер одна из имплементаций- сосбтвенно такой комент на стаке везде написан.
Я так понял перестало работать с 5.2
16 ноя 20, 09:04    [22232603]     Ответить | Цитировать Сообщить модератору
 Re: Немного SQL перенести на хибер  [new]
Leonid Kudryavtsev
Member

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

но хибер не поддерживает ее ,если класс на который ты мапишься не сущность и собственно не обязан,так как эта анотация JPA

AFAIK конфиги хибера не обязательно задавать в виде анотаций, можно задавать в виде XML-конфигов.
16 ноя 20, 13:28    [22232867]     Ответить | Цитировать Сообщить модератору
 Re: Немного SQL перенести на хибер  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 6525
mayton
Лучшее - враг хорошего. Бери моё решение. Оно работает. Не циклись на JPA аннотациях.
он до сих пор не проверил что ли?
16 ноя 20, 13:29    [22232870]     Ответить | Цитировать Сообщить модератору
 Re: Немного SQL перенести на хибер  [new]
Zzz79
Member

Откуда:
Сообщений: 1005
PetroNotC Sharp
mayton
Лучшее - враг хорошего. Бери моё решение. Оно работает. Не циклись на JPA аннотациях.
он до сих пор не проверил что ли?

я взял понемногу от всех,но пока не донца допилил запрос,так как там помимо того что меняются условия ,меняется и очередность биндинга,а это конечно превращает конструкцию в какого то монстра
16 ноя 20, 14:05    [22232912]     Ответить | Цитировать Сообщить модератору
 Re: Немного SQL перенести на хибер  [new]
mayton
Member

Откуда: loopback
Сообщений: 49762
Zzz79
PetroNotC Sharp
пропущено...
он до сих пор не проверил что ли?

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

Ну покажи как билдер щас выглядит.
16 ноя 20, 14:14    [22232920]     Ответить | Цитировать Сообщить модератору
 Re: Немного SQL перенести на хибер  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 6525
Zzz79
взял понемногу от всех,но пока не донца
ты не изменился.
Надо фиксировать промежуточные этапы.
- где этап вввод запроса ОДНОГО по rest без АННОТАЦИИ Entity?
- потом этап динамики и меняющихся запросов.
16 ноя 20, 14:28    [22232935]     Ответить | Цитировать Сообщить модератору
 Re: Немного SQL перенести на хибер  [new]
Zzz79
Member

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

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

Ну покажи как билдер щас выглядит.

пока я только p.Id забиндил и оно не работает почему то - сама среда разработки показывает что что то не так
  public Query getQuery(UnsuberRequest request){
        String pollIdPredicate=request.getPid()==null? "":"and p.id = ?2 ";
        String unsubDatePredicate=request.getDateFrom()==null&&request.getDateTo()==null?"":"";



        Query query = em.createNativeQuery("select me.email as email,me.unsubscribe_date as dates,pc.poll_id as poll " +
                "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 = ?1 " +
                 pollIdPredicate +
                "and me.unsubscribed = 'true' " +
                "and me.unsubscribe_date between ?3 and ?4 ");
        
        return query;
        
    }
16 ноя 20, 14:28    [22232936]     Ответить | Цитировать Сообщить модератору
 Re: Немного SQL перенести на хибер  [new]
mrWolf
Member

Откуда: Тридевятое царство
Сообщений: 84
Zzz79

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

Для динамических запросов есть JPA Criteria API. Синтаксис не самый понятный, но вопросы решает.
16 ноя 20, 14:36    [22232947]     Ответить | Цитировать Сообщить модератору
 Re: Немного SQL перенести на хибер  [new]
mayton
Member

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

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

Для динамических запросов есть JPA Criteria API. Синтаксис не самый понятный, но вопросы решает.

А он поддерживает pivoting data, windowed functions?
16 ноя 20, 14:46    [22232958]     Ответить | Цитировать Сообщить модератору
 Re: Немного SQL перенести на хибер  [new]
Zzz79
Member

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

Ну покажи как билдер щас выглядит.

пока я только p.Id забиндил и оно не работает почему то - сама среда разработки показывает что что то не так
  public Query getQuery(UnsuberRequest request){
        String pollIdPredicate=request.getPid()==null? "":"and p.id = ?2 ";
        String unsubDatePredicate=request.getDateFrom()==null&&request.getDateTo()==null?"":"";



        Query query = em.createNativeQuery("select me.email as email,me.unsubscribe_date as dates,pc.poll_id as poll " +
                "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 = ?1 " +
                 pollIdPredicate +
                "and me.unsubscribed = 'true' " +
                "and me.unsubscribe_date between ?3 and ?4 ");
        
        return query;
        
    }


удвительно ,но это работает) видимо не настолько умная среда разработки)

короче теперь надо с датами понять что делать там мне говоят использовать логические операторы- но тогда я погрязну в ифах
то если после даты исользуй >= если до <= ,а время нам приходит в UNIX, у которого весьма оргничен интервал - я думаю я вобью как константы начальное и конечное время UNIX и буду ими играться и between как ты майтон и писал
16 ноя 20, 14:53    [22232971]     Ответить | Цитировать Сообщить модератору
 Re: Немного SQL перенести на хибер  [new]
mayton
Member

Откуда: loopback
Сообщений: 49762
Сделай все на константах

"and me.unsubscribe_date between CAST('2019-01-01T00:00:00' AS DATETIME) and CAST('2020-01-01T00:00:00' AS DATETIME)");

(тут надо уточнить какой диалект SQL. Могут быть нюансы)

И добейся успешной безошибочной работы SQL.
А потом перенесешь в bind-variables.
16 ноя 20, 16:06    [22233047]     Ответить | Цитировать Сообщить модератору
 Re: Немного SQL перенести на хибер  [new]
Zzz79
Member

Откуда:
Сообщений: 1005
mayton
Сделай все на константах

"and me.unsubscribe_date between CAST('2019-01-01T00:00:00' AS DATETIME) and CAST('2020-01-01T00:00:00' AS DATETIME)");

(тут надо уточнить какой диалект SQL. Могут быть нюансы)

И добейся успешной безошибочной работы SQL.
А потом перенесешь в bind-variables.

нет времени - надо выкатывать пр к сожалению

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

Откуда: loopback
Сообщений: 49762
У нас - всю жизнь "нету времени". Это обычное дело. Вот родится ребенок и тогда времени - еще меньше.

Но по твоей таске - у тебя там еще конь не валялся. Ничего не исследовано. Как делать - неизвестно.
Тоесть если тебя спросить - сколько еще времени будешь доделывать - то ты ХЗ. Или скажешь не знаю.
Или скажешь - ну еще недельку. Или месячишко... Айай нельзя так эстимировать. Тут - до прода еще далеко.
16 ноя 20, 16:27    [22233073]     Ответить | Цитировать Сообщить модератору
 Re: Немного SQL перенести на хибер  [new]
Zzz79
Member

Откуда:
Сообщений: 1005
mayton,
согласен )

вот первая версия того что я наваял
package ru.oprosso.backend.services.api;

import org.hibernate.transform.Transformers;
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.getPid() == null ? "" : "and p.id = ?2 ";
        String unsubDatePredicate = request.getPid() == null ? "and me.unsubscribe_date between ?2 and ?3 " : "and me.unsubscribe_date between ?3 and ?4 ";

        Query query = em.createNativeQuery("select me.email as email,me.unsubscribe_date as dates,pc.poll_id as poll " +
                "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 = ?1 " +
                pollIdPredicate +
                "and me.unsubscribed = 'true' " +
                unsubDatePredicate);

        return query;
    }

    @Override
    public List<UnsuberResponse> unsuberList(Long spaceId, UnsuberRequest request) {

        Query query = getQuery(request);
        Timestamp fr = Optional.ofNullable(converter(request.getDateFrom()))
                .orElse(MIN_VALUE);
        Timestamp to = Optional.ofNullable(converter(request.getDateTo()))
                .orElse(MAX_VALUE);

        query.setParameter(1, spaceId);
        if (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);

        }
        query.unwrap(org.hibernate.Query.class)
                .setResultTransformer(Transformers.aliasToBean(UnsuberResponse.class));
        return query.getResultList();

    }

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

    }
}
16 ноя 20, 16:44    [22233103]     Ответить | Цитировать Сообщить модератору
 Re: Немного SQL перенести на хибер  [new]
mayton
Member

Откуда: loopback
Сообщений: 49762
Как-то много букв.

Timestamp fr = Optional.ofNullable(converter(request.getDateFrom())).orElse(MIN_VALUE);


Есть же в апаче коммонс или в гуаве метод на 3 буквы.
16 ноя 20, 16:56    [22233114]     Ответить | Цитировать Сообщить модератору
 Re: Немного SQL перенести на хибер  [new]
Leonid Kudryavtsev
Member

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

        String unsubDatePredicate = request.getPid() == null ? "and me.unsubscribe_date between ?2 and ?3 " : "and me.unsubscribe_date between ?3 and ?4 ";


Этого не понял (занафига?), но хозяин - барин.
16 ноя 20, 16:56    [22233115]     Ответить | Цитировать Сообщить модератору
 Re: Немного SQL перенести на хибер  [new]
mayton
Member

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

Timestamp fr = firstNonNull(converter(request.getDateFrom()),MIN_VALUE);
16 ноя 20, 16:59    [22233119]     Ответить | Цитировать Сообщить модератору
 Re: Немного SQL перенести на хибер  [new]
mayton
Member

Откуда: loopback
Сообщений: 49762
request.getPid() == null ? "and me.unsubscribe_date between ?2 and ?3 " : "and me.unsubscribe_date between ?3 and ?4 ";


Здесь - тернарный оператор хорош но он еще сворачивается в

"and me.unsubscribe_date between" + request.getPid() == null ? "?2 and ?3 " : "?3 and ?4";
16 ноя 20, 17:04    [22233124]     Ответить | Цитировать Сообщить модератору
 Re: Немного SQL перенести на хибер  [new]
Zzz79
Member

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

        String unsubDatePredicate = request.getPid() == null ? "and me.unsubscribe_date between ?2 and ?3 " : "and me.unsubscribe_date between ?3 and ?4 ";


Этого не понял (занафига?), но хозяин - барин.

затем что нам может не придти poll id,тогда значеий которые мы подставляем будет 3 а не 4
16 ноя 20, 17:06    [22233127]     Ответить | Цитировать Сообщить модератору
 Re: Немного SQL перенести на хибер  [new]
Leonid Kudryavtsev
Member

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

затем что нам может не придти poll id,тогда значеий которые мы подставляем будет 3 а не 4

как это сказывается на SQL команду и зачем там вообще упоминать 3 и/или 4 - мне не понятно

p.s. JDBC'шного синтаксиса SQL не помню, пользуюсь другим ))). Но сильно сомневаюсь, что бы там это требовалось.
16 ноя 20, 17:09    [22233132]     Ответить | Цитировать Сообщить модератору
 Re: Немного SQL перенести на хибер  [new]
Leonid Kudryavtsev
Member

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

int pos_num = 1;
'...'||(pos_num++)||'...'
делал бы, на мой вкус

Хотя, мне кажется это совершенно НЕ требуется
16 ноя 20, 17:11    [22233135]     Ответить | Цитировать Сообщить модератору
 Re: Немного SQL перенести на хибер  [new]
Zzz79
Member

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

будет ошибка - биндинг оут оф ординал ,в месте ,где мы сеттим значения
16 ноя 20, 17:13    [22233138]     Ответить | Цитировать Сообщить модератору
 Re: Немного SQL перенести на хибер  [new]
Leonid Kudryavtsev
Member

Откуда:
Сообщений: 9249
Вроде же символ ? существует
16 ноя 20, 17:16    [22233140]     Ответить | Цитировать Сообщить модератору
 Re: Немного SQL перенести на хибер  [new]
mayton
Member

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

Тогда будет как-то так.
"and me.unsubscribe_date between ?" + (cnt++) + " and ?" + (cnt++) 
16 ноя 20, 17:19    [22233143]     Ответить | Цитировать Сообщить модератору
 Re: Немного SQL перенести на хибер  [new]
Zzz79
Member

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

затем что нам может не придти poll id,тогда значеий которые мы подставляем будет 3 а не 4

как это сказывается на SQL команду и зачем там вообще упоминать 3 и/или 4 - мне не понятно

p.s. JDBC'шного синтаксиса SQL не помню, пользуюсь другим ))). Но сильно сомневаюсь, что бы там это требовалось.

3,4 указывается для того,кто потом этот код будет поддерживать( уважайте всега своих коллег) чтобы явно было видно что и куда подставляется,я понимаю к чему вы клоните - можно сделать иньекцию прямоо в выражение - но я так не хочу ,специально оставил сеттинг параметров для удобной читаемости
16 ноя 20, 17:19    [22233144]     Ответить | Цитировать Сообщить модератору
 Re: Немного SQL перенести на хибер  [new]
Zzz79
Member

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

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

нечитабельно совсем ,я все понимаю что там можно нарефкаторить) но надо помнить,что люди будут этого код поддерживать и вот такая инкрементация будет тяжела для восприятия- где тут первая позиция ,где вторая?
16 ноя 20, 17:22    [22233146]     Ответить | Цитировать Сообщить модератору
 Re: Немного SQL перенести на хибер  [new]
Zzz79
Member

Откуда:
Сообщений: 1005
mayton
request.getPid() == null ? "and me.unsubscribe_date between ?2 and ?3 " : "and me.unsubscribe_date between ?3 and ?4 ";


Здесь - тернарный оператор хорош но он еще сворачивается в

"and me.unsubscribe_date between" + request.getPid() == null ? "?2 and ?3 " : "?3 and ?4";

чем больше контактаций - тем хуже памяти- выигрваем пару литералов,при этом клаем в память лишний объект ,который там будет болтаться непонятно зачем
16 ноя 20, 17:24    [22233147]     Ответить | Цитировать Сообщить модератору
 Re: Немного SQL перенести на хибер  [new]
Zzz79
Member

Откуда:
Сообщений: 1005
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
Сообщений: 49762
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
Сообщений: 49762
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
Сообщений: 49762
По поводу 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
Сообщений: 49762
О пользе и вреде шаблонизации сейчас в проекте Стаса мы не можем говорить. Мы не видели весь проект.
Следовательно наши знания - ограничены.

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

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

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

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

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

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

Откуда:
Сообщений: 1005
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

Откуда:
Сообщений: 1005
ПРичем я все равно вижу решение с 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

Откуда:
Сообщений: 1005
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

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

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

Откуда:
Сообщений: 1005
Лепим вот такие костыли
      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

Откуда:
Сообщений: 1005
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

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


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

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

Откуда:
Сообщений: 1005
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

Откуда:
Сообщений: 1005
вот такой селект делает все что мне надо - сначала дату в секунды 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
Сообщений: 49762
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
Сообщений: 49762
Андрей Панфилов
mayton
По поводу JPA / Criteria API с которыми форум Java бегает как с "писаной торбой".

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


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

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

Откуда: loopback
Сообщений: 49762
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
Сообщений: 49762
Ну тогда зачем целое число кастить в текст?
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
Сообщений: 49762
Делай как хочешь. Просто мне кажется что часть преобразований в запросе не очень-то нужны.
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
Сообщений: 49762
Между постманом и твоим запросом еще стоит стек технологий. И этот стек формирует 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
Сообщений: 49762
Сколько строк возвращает твой запрос в этом кейсе?
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
Сообщений: 49762
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
Сообщений: 49762
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
Сообщений: 49762
Разные варианты кастинга (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]     Ответить | Цитировать Сообщить модератору
 Re: Немного SQL перенести на хибер  [new]
mayton
Member

Откуда: loopback
Сообщений: 49762
Можно стабилизировать порядок mandatory переменных.
s.id, unsubscribe_date присутствуют всегда. Поднять их наверх.
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 = ? 
                "and me.unsubscribed = 'true' " +
                "and me.unsubscribe_date between ? and ? " +
                pollIdPredicate


А вариативная часть пойдет в конце.
17 ноя 20, 18:26    [22234060]     Ответить | Цитировать Сообщить модератору
 Re: Немного SQL перенести на хибер  [new]
mayton
Member

Откуда: loopback
Сообщений: 49762
И переменные.

                query.setParameter(1, spaceId);
                query.setParameter(2, fr);
                query.setParameter(3, to);
                if (request != null && request.getPid() != null) {
                            query.setParameter(4, Long.valueOf(request.getPid()));                            
                } 
17 ноя 20, 18:27    [22234062]     Ответить | Цитировать Сообщить модератору
 Re: Немного SQL перенести на хибер  [new]
Leonid Kudryavtsev
Member

Откуда:
Сообщений: 9249
Точнее так (псевдокод, поля не совпадают, могут быть опечатки)

StringBuilder sb;
..
if ( pid != null ) {
  sb.append( "and p.id = ? ";
}
if ( minDt != null ) {
  sb.append( "and dt >= ? ";
}
if ( maxDt != null ) {
  sb.append( "and dt <= ? ";
}
...
if ( pid != null) {
  query.setParameter( pos++, pid );
}
if ( minDt != null ) {
  query.setParameter( pos++, minDt );
}
if ( maxDt != null ) {
  query.setParameter( pos++, maxDt );
}
17 ноя 20, 18:28    [22234063]     Ответить | Цитировать Сообщить модератору
 Re: Немного SQL перенести на хибер  [new]
Leonid Kudryavtsev
Member

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

А вариативная часть пойдет в конце.

для конкретного запроса пойдет, но как принцип - не особо

3-и параметра для запроса, это как-то очень слабо. У нас до десятков точно доходило. В более-менее нормальном интерфейсе практически на любое поле должна быть возможность поставить условие IMHO & AFAIK. Если, конечно, среда разработки по умолчанию Query-by-example не предоставляет )))
17 ноя 20, 18:31    [22234064]     Ответить | Цитировать Сообщить модератору
 Re: Немного SQL перенести на хибер  [new]
Leonid Kudryavtsev
Member

Откуда:
Сообщений: 9249
mayton
А вариативная часть пойдет в конце.


когда практически все в запросе бывает вариативным, иногда специально делают mandatory часть:
sb.append( "SELECT...FROM...WHERE 1=1" );
if (...) {
  sb.append( " and .... " );
} 

В некоторых системах с непривычки это иногда удивляет, откуда и зачем 1=1, 2=2, 3=3 etc.. чисто для того, что бы с "and" не заморачиваться )))

Но я часто заводил специальный флаг, т.к. особой сложности с and нет, а селект все же более эстетически красивым получается. Ну и никто не мешает, весь это Building обернуть процедурами/ф-циями. Главное, что бы без фанатизма.
17 ноя 20, 18:40    [22234071]     Ответить | Цитировать Сообщить модератору
 Re: Немного SQL перенести на хибер  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 6525
Leonid Kudryavtsev
Главное, что бы без фанатизма.
угу.
А то скоро фреймворк получится.)
17 ноя 20, 18:43    [22234073]     Ответить | Цитировать Сообщить модератору
 Re: Немного SQL перенести на хибер  [new]
PetroNotC Sharp
Member

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

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 );
+1
17 ноя 20, 18:45    [22234074]     Ответить | Цитировать Сообщить модератору
 Re: Немного SQL перенести на хибер  [new]
mayton
Member

Откуда: loopback
Сообщений: 49762
По сути тема данного обсуджения - торговля между сохранить StringBuilder еще на парочку релизов
или выкинуть все к еб...ням и переписать на MyBatis или Camunda как тут советует товарищ.
17 ноя 20, 18:50    [22234078]     Ответить | Цитировать Сообщить модератору
 Re: Немного SQL перенести на хибер  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 6525
mayton,
Да. Потому что фильтры магазинов это целые либы а не select+f+from+where
17 ноя 20, 19:01    [22234087]     Ответить | Цитировать Сообщить модератору
 Re: Немного SQL перенести на хибер  [new]
mayton
Member

Откуда: loopback
Сообщений: 49762
Для крупных магазинов - нужен фасетный поиск. По EAV. Да еще и с молниеносным
откликом. Типа показать все телевизоры с диагональю 34"", с двумя портами HDMI + Display,
в акции, да еще и чтоб Андроид был, да еще и чтоб был удобны пульты ДУ с кнопочками
для бабушки. Тут не то что трудно написать SQL а тут нужно принципиально другое
решение наподобие очень быстрого кеша + полнотекстового поиска + кластер БД.
17 ноя 20, 19:08    [22234091]     Ответить | Цитировать Сообщить модератору
 Re: Немного SQL перенести на хибер  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 6525
mayton,
Ну, модель хранения может быть и не EAV. Их полно всяких.
Но вот то что "принципиально другое", тут согласен.
17 ноя 20, 19:10    [22234094]     Ответить | Цитировать Сообщить модератору
 Re: Немного SQL перенести на хибер  [new]
mayton
Member

Откуда: loopback
Сообщений: 49762
Да. EAV может и не быть. Может быть JSON-документ. Может быть просто разветвлённая сеть таблиц
доменной модели. Но в крупных магазинах товары не имеют ограничений на спеку. Возьмите например
стиральную машинку. Или холодильник. И там можно сразу насчитать до 100 потребительских опций
и причем для холодильников и стиралок они почти не перескаются.
17 ноя 20, 19:16    [22234099]     Ответить | Цитировать Сообщить модератору
 Re: Немного SQL перенести на хибер  [new]
вадя
Member

Откуда: Екатеринбург
Сообщений: 18324
я предлагал вариант без модификации sql-строки 22231682
чем не понравилось?
17 ноя 20, 21:01    [22234171]     Ответить | Цитировать Сообщить модератору
 Re: Немного SQL перенести на хибер  [new]
Leonid Kudryavtsev
Member

Откуда:
Сообщений: 9249
mayton
Для крупных магазинов - нужен фасетный поиск. По EAV. Да еще и с молниеносным
откликом. Типа показать все телевизоры с диагональю 34"", с двумя портами HDMI + Display,
в акции, да еще и чтоб Андроид был, да еще и чтоб был удобны пульты ДУ с кнопочками
для бабушки. Тут не то что трудно написать SQL а тут нужно принципиально другое
решение наподобие очень быстрого кеша + полнотекстового поиска + кластер БД.


Жесть какая.

Интересно, сколько в данном магазине одновременно товаров продается. Т.к. для пары десятков тысяч ( 50-100 тысяч) точно никакое "принципиально другое решение наподобие очень быстрого кеша + полнотекстового поиска + кластер БД" не требуется
IMHO & AFAIK

В 1998-1999 делал самописный полнотекстовый поиск по базе в 50 000 записей (современная версия http://iss.rybmuseum.ru/ от моего кода вряд ли что осталось, но мой код был ф-циональней, по крайне мере в результатах поиска еще совпадения подсвечивались /теперь не подсвечиваются ))) /) - все работало на "серверах" класса Celeron 400 Mz 16 Mg RAM. От PostgreSQL пришлось отказаться из-за тормознутости (vacuum) и перейти на MySQL ))).

Все занимало примерно 2-3 тысячи строк кода на Java.... но сейчас прогресс... без "принципиально другое решение" работать уже не может )))

Структура была EAV. Но весь поиск - чистый SQL на временных таблицах.
17 ноя 20, 21:37    [22234194]     Ответить | Цитировать Сообщить модератору
 Re: Немного SQL перенести на хибер  [new]
Leonid Kudryavtsev
Member

Откуда:
Сообщений: 9249
вадя
я предлагал вариант без модификации sql-строки 22231682
чем не понравилось?

несколько таких конструкций в результирующем запросе - запросто убьет и оптимизатор и план

AFAIK
17 ноя 20, 21:39    [22234196]     Ответить | Цитировать Сообщить модератору
 Re: Немного SQL перенести на хибер  [new]
mayton
Member

Откуда: loopback
Сообщений: 49762
Leonid Kudryavtsev
mayton
Для крупных магазинов - нужен фасетный поиск. По EAV. Да еще и с молниеносным
откликом. Типа показать все телевизоры с диагональю 34"", с двумя портами HDMI + Display,
в акции, да еще и чтоб Андроид был, да еще и чтоб был удобны пульты ДУ с кнопочками
для бабушки. Тут не то что трудно написать SQL а тут нужно принципиально другое
решение наподобие очень быстрого кеша + полнотекстового поиска + кластер БД.


Жесть какая.

Интересно, сколько в данном магазине одновременно товаров продается. Т.к. для пары десятков тысяч ( 50-100 тысяч) точно никакое "принципиально другое решение наподобие очень быстрого кеша + полнотекстового поиска + кластер БД" не требуется
IMHO & AFAIK

В 1998-1999 делал самописный полнотекстовый поиск по базе в 50 000 записей (современная версия http://iss.rybmuseum.ru/ от моего кода вряд ли что осталось, но мой код был ф-циональней, по крайне мере в результатах поиска еще совпадения подсвечивались /теперь не подсвечиваются ))) /) - все работало на "серверах" класса Celeron 400 Mz 16 Mg RAM. От PostgreSQL пришлось отказаться из-за тормознутости (vacuum) и перейти на MySQL ))).

Все занимало примерно 2-3 тысячи строк кода на Java.... но сейчас прогресс... без "принципиально другое решение" работать уже не может )))

Структура была EAV. Но весь поиск - чистый SQL на временных таблицах.

В 1999 году пользователи сидели на модемах. И в ваш магазин ходило полтора человека.

Ну вобщем как нельзя зайти в одну воду два раза, так и нельзя сравнить требования современного
магазина типа Amazon/Aliexpress/Ebay с магазином Пром-Товары вашего города.

Хотя я готов принять как факт что ваш магазин таки .. работал
17 ноя 20, 21:46    [22234203]     Ответить | Цитировать Сообщить модератору
 Re: Немного SQL перенести на хибер  [new]
вадя
Member

Откуда: Екатеринбург
Сообщений: 18324
Leonid Kudryavtsev
несколько таких конструкций в результирующем запросе - запросто убьет и оптимизатор и план
проверял?
на таком простом запросе потери будут минимальны
17 ноя 20, 22:28    [22234228]     Ответить | Цитировать Сообщить модератору
 Re: Немного SQL перенести на хибер  [new]
mayton
Member

Откуда: loopback
Сообщений: 49762
вадя
Leonid Kudryavtsev
несколько таких конструкций в результирующем запросе - запросто убьет и оптимизатор и план
проверял?
на таком простом запросе потери будут минимальны

Здесь имеет место inner join из 6 таблиц. Тоесть если-бы мы кодили
эту задачу на java к примеру то у нас было-бы (грубо) 6!(факториал) = 720
возможных алгоритмов соединения (это без учета WHERE clause).

Тоесть план может прыгать. Не знаю как .. тут наверное MS-SQL .. он отрабатывает
подобные запросы.
17 ноя 20, 22:44    [22234233]     Ответить | Цитировать Сообщить модератору
 Re: Немного SQL перенести на хибер  [new]
вадя
Member

Откуда: Екатеринбург
Сообщений: 18324
mayton
Здесь имеет место inner join из 6 таблиц.
ну и что?
where p.id= if(ifnull(pollId ),p.id,pollId )
разве if влиять?
17 ноя 20, 22:51    [22234238]     Ответить | Цитировать Сообщить модератору
 Re: Немного SQL перенести на хибер  [new]
mayton
Member

Откуда: loopback
Сообщений: 49762
Мда. Может быть. Если s.id селективен то наверное имеет смысл начинать с фильтра по space.
Если-бы предложения WHERE не сущестовало то тогда мы-бы делали просто различную эвристику
над внешними и прочими ключами.
17 ноя 20, 23:08    [22234247]     Ответить | Цитировать Сообщить модератору
 Re: Немного SQL перенести на хибер  [new]
Zzz79
Member

Откуда:
Сообщений: 1005
вадя
я предлагал вариант без модификации sql-строки 22231682
чем не понравилось?

не совсем понял как в такой конструкции сделать биндинг
тоесть вот этот знак '?' надо куда то ставить и далее делать query.setParameter(1,pollId)

твой фильтр выглядит вот так

where p.id= if(ifnull(pollId ),p.id,pollId )

тоесть в моем варианте он должен выглядеть как то так
where p.id= if(ifnull(? ),p.id,? )

тогда уже будет два биндинга или как ты предлагаешь?
в nativeQuery в любом случае так или иначе надо значения биндить и я не понял как это осуществить в данном конкретном случае
18 ноя 20, 10:02    [22234386]     Ответить | Цитировать Сообщить модератору
 Re: Немного SQL перенести на хибер  [new]
Zzz79
Member

Откуда:
Сообщений: 1005
mayton
Можно стабилизировать порядок mandatory переменных.
s.id, unsubscribe_date присутствуют всегда. Поднять их наверх.
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 = ? 
                "and me.unsubscribed = 'true' " +
                "and me.unsubscribe_date between ? and ? " +
                pollIdPredicate


А вариативная часть пойдет в конце.

а с точки зрения самого запроса это норм будет ? бд нет разницы в каком порядке фильтры идут?ибо если она фильтрует по порядку - то сначала выберет все с датами всех пулов - а мне нужен пул определенный- как это с точки производительности будет выглядеть
?
18 ноя 20, 10:05    [22234387]     Ответить | Цитировать Сообщить модератору
 Re: Немного SQL перенести на хибер  [new]
Zzz79
Member

Откуда:
Сообщений: 1005
mayton
И переменные.

                query.setParameter(1, spaceId);
                query.setParameter(2, fr);
                query.setParameter(3, to);
                if (request != null && request.getPid() != null) {
                            query.setParameter(4, Long.valueOf(request.getPid()));                            
                } 

вот этот вариант самый читаемый для пользователя,все-таки инкрементация в биндинге такое себе.
Осталось понять не повлияет ли это на производительность ,так как по уму сначала фильтруем по группе( spaceId) потом по опросу( pollId) потом по датам уже ,не получится ли так что мы при введеном pollId все равно сначала и только потом фильтранем по pollId
либо же where запрос работает как единое целое и ему пох в каком порядке стоят фильтры.
18 ноя 20, 10:19    [22234396]     Ответить | Цитировать Сообщить модератору
 Re: Немного SQL перенести на хибер  [new]
Zzz79
Member

Откуда:
Сообщений: 1005
Leonid Kudryavtsev
Точнее так (псевдокод, поля не совпадают, могут быть опечатки)

StringBuilder sb;
..
if ( pid != null ) {
  sb.append( "and p.id = ? ";
}
if ( minDt != null ) {
  sb.append( "and dt >= ? ";
}
if ( maxDt != null ) {
  sb.append( "and dt <= ? ";
}
...
if ( pid != null) {
  query.setParameter( pos++, pid );
}
if ( minDt != null ) {
  query.setParameter( pos++, minDt );
}
if ( maxDt != null ) {
  query.setParameter( pos++, maxDt );
}


не многовато ли if?где то я читал ,помоему в чистом коде,что если у тебя больше двух ифов - код автоматически превращается в г0вно
18 ноя 20, 11:02    [22234420]     Ответить | Цитировать Сообщить модератору
 Re: Немного SQL перенести на хибер  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 6525
Zzz79,
1 про количество if и наличие циклов ерунда. Так 16ти летки говорят.
2. скорость запроса и тюнинг после цифр о том что там не устраивает.
18 ноя 20, 11:06    [22234425]     Ответить | Цитировать Сообщить модератору
 Re: Немного SQL перенести на хибер  [new]
Zzz79
Member

Откуда:
Сообщений: 1005
PetroNotC Sharp
Zzz79,
1 про количество if и наличие циклов ерунда. Так 16ти летки говорят.
2. скорость запроса и тюнинг после цифр о том что там не устраивает.

совсем не ерунда,если тебе нужно больше двух иф - значит проблема в архитектуре ,по крайне мере так пишет Роберт Мартин,с ним я в целом согласен - жава гибкая и помогает избежать такого количества условий- а если нет ,значит однозначно вы делаете костыль)
18 ноя 20, 11:17    [22234433]     Ответить | Цитировать Сообщить модератору
 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");


    @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);
        
        int pos = 1;

        query.setParameter(pos++, spaceId);
        query.setParameter(pos++, fr);
        query.setParameter(pos++, to);
        if (request != null && request.getPid() != null) {
            query.setParameter(pos, Long.valueOf(request.getPid()));
        }

        return query.getResultList();

    }

    private 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 = ? " +
                "and me.unsubscribed = 'true' " +
                "and me.unsubscribe_date between ? and ? " +
                pollIdPredicate);

        return query;
    }

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

    }

    private String getSpaceIdByXApiKey(String xAPiKey) {
        //ToDO реализовать механизм поиска группы по X-API-KEY
        return "";
    }
}
18 ноя 20, 11:18    [22234434]     Ответить | Цитировать Сообщить модератору
 Re: Немного SQL перенести на хибер  [new]
Zzz79
Member

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

query.setParameter (pos++, to );

последняя инкрементация лишняя ,соеденил ваш вариант + майтона
18 ноя 20, 11:20    [22234435]     Ответить | Цитировать Сообщить модератору
 Re: Немного SQL перенести на хибер  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 6525
Zzz79
PetroNotC Sharp
Zzz79,
1 про количество if и наличие циклов ерунда. Так 16ти летки говорят.
2. скорость запроса и тюнинг после цифр о том что там не устраивает.

совсем не ерунда,если тебе нужно больше двух иф - значит проблема в архитектуре ,по крайне мере так пишет Роберт Мартин,с ним я в целом согласен - жава гибкая и помогает избежать такого количества условий- а если нет ,значит однозначно вы делаете костыль)

Про архитектуру тебе пока рано.
Ты слово Модель не выучил. Только аннотации.
18 ноя 20, 11:23    [22234437]     Ответить | Цитировать Сообщить модератору
 Re: Немного SQL перенести на хибер  [new]
Leonid Kudryavtsev
Member

Откуда:
Сообщений: 9249
вадя
Leonid Kudryavtsev
несколько таких конструкций в результирующем запросе - запросто убьет и оптимизатор и план
проверял?
на таком простом запросе потери будут минимальны


Простота запроса не при чем. Убивается оптимизатор, использование индексов (кроме одного) и соответственно план.
18 ноя 20, 11:36    [22234444]     Ответить | Цитировать Сообщить модератору
 Re: Немного SQL перенести на хибер  [new]
mayton
Member

Откуда: loopback
Сообщений: 49762
Zzz79
mayton
И переменные.

                query.setParameter(1, spaceId);
                query.setParameter(2, fr);
                query.setParameter(3, to);
                if (request != null && request.getPid() != null) {
                            query.setParameter(4, Long.valueOf(request.getPid()));                            
                } 

вот этот вариант самый читаемый для пользователя,все-таки инкрементация в биндинге такое себе.
Осталось понять не повлияет ли это на производительность ,так как по уму сначала фильтруем по группе( spaceId) потом по опросу( pollId) потом по датам уже ,не получится ли так что мы при введеном pollId все равно сначала и только потом фильтранем по pollId
либо же where запрос работает как единое целое и ему пох в каком порядке стоят фильтры.

Порядок применения предикатов не регламентируется SQL. Тоесть грубо говоря
регламентирован только результат но не способ его достижения.

Некоторые DBMS могут учитывать порядок выражений в WHERE.
Но я готов спорить на виски что в большинстве случаев для DBMS
важно

1) Наличие индекса по предикату (или композитного индекса или партишенинга или кластеризованного индекса)
2) Наличие предположения о селективности на основе статистики которую база хранит для каждой колонки.
18 ноя 20, 13:54    [22234575]     Ответить | Цитировать Сообщить модератору
 Re: Немного SQL перенести на хибер  [new]
Zzz79
Member

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

понял спасибо

хочу все таки отойти от хардкода и заменить условия на where unsub_date>= ? или where unsub_date <= ?
собственно это будут от или до
если заданы два значения делать between
а если значений нет ,то и фильтрации по времени нет

все таки мне это кажется более логичным ,чем хардкодить конечные даты
18 ноя 20, 15:55    [22234701]     Ответить | Цитировать Сообщить модератору
 Re: Немного SQL перенести на хибер  [new]
Zzz79
Member

Откуда:
Сообщений: 1005
Хотя я так понимаю unix имеет ограниченный лимит с 1970 по 2038 год - что в принципе оправдаывает конструкцию ,которая у меня сейчас
18 ноя 20, 16:08    [22234715]     Ответить | Цитировать Сообщить модератору
 Re: Немного SQL перенести на хибер  [new]
Ржавый гвоздь
Member

Откуда:
Сообщений: 116
Тема просто треш какой-то Несколько страниц обсуждать, как затемплейтить примитивный запрос
18 ноя 20, 16:22    [22234725]     Ответить | Цитировать Сообщить модератору
 Re: Немного SQL перенести на хибер  [new]
Leonid Kudryavtsev
Member

Откуда:
Сообщений: 9249
Ржавый гвоздь
Тема просто треш какой-то Несколько страниц обсуждать, как затемплейтить примитивный запрос


Солдат спит, служба идет.

Обсуждение на sql.ru, а зарплата идет.
18 ноя 20, 16:24    [22234727]     Ответить | Цитировать Сообщить модератору
 Re: Немного SQL перенести на хибер  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 6525
Ржавый гвоздь
Тема просто треш какой-то Несколько страниц обсуждать, как затемплейтить примитивный запрос

)))
Тюнить бд и думать ставить between или нет с завязанными глазами.
))))
18 ноя 20, 16:27    [22234731]     Ответить | Цитировать Сообщить модератору
 Re: Немного SQL перенести на хибер  [new]
Zzz79
Member

Откуда:
Сообщений: 1005
Ржавый гвоздь
Тема просто треш какой-то Несколько страниц обсуждать, как затемплейтить примитивный запрос

ну так покажи свой код,посмотрим что у тебя там за запросы уровня "NASA" ,наверняка есть что показать,не зря же ты тут свой высер оставил многозначительный)


а по теме какие задачи ставят ,такие и решения))

вот у меня в задаче написано

 UNIX timestamp GMT (время в секундах)
 UNIX timestamp  (время в секундах)

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

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

....ведь человек это писавший думает что в время отображенное как количесво секунд от 1970 года имеет диферинцацию по тайм зонам))

а 1970 год наступил сразу же? одновременно по всей планете?

каким образом отображение времени и наличие/отстутствие тайм зоны связано между собой - для меня загадка
18 ноя 20, 16:52    [22234763]     Ответить | Цитировать Сообщить модератору
 Re: Немного SQL перенести на хибер  [new]
Zzz79
Member

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

....ведь человек это писавший думает что в время отображенное как количесво секунд от 1970 года имеет диферинцацию по тайм зонам))

а 1970 год наступил сразу же? одновременно по всей планете?

каким образом отображение времени и наличие/отстутствие тайм зоны связано между собой - для меня загадка

загуглите что такое unix timestamp ,чтобы для вас не оставалось загадок))
ну хотя ладно я сделаю это для вас,так как вы мне тоже помогли

The definition of UNIX timestamp is timezone independent. The timestamp is the number of seconds (or milliseconds) elapsed since an absolute point in time, midnight of Jan 1 1970 in UTC time


тоесть как бы unix time oн везде один и тот же,будь ты на чукотке или в калининграде
18 ноя 20, 17:21    [22234779]     Ответить | Цитировать Сообщить модератору
 Re: Немного SQL перенести на хибер  [new]
mayton
Member

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

понял спасибо

хочу все таки отойти от хардкода и заменить условия на where unsub_date>= ? или where unsub_date <= ?
собственно это будут от или до
если заданы два значения делать between
а если значений нет ,то и фильтрации по времени нет

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

Можно вообще уйти от работы с датами и работать с целыми числами в виде Unix Timestamp.
Кажется в java.sql.Timestamp должен быть метод для извлечения секунд.
Тогда MIN/MAX value будут просто пограничными значениями для integer/long
(секунды/милисекунды). Это дает некую однородность при работе с проверками
на больше/меньше/равно. Такие проверки всегда надёжно работают т.к. нет
погрешностей перевода типа потерянных секунд в сутках или долей секунд
если формат дат более грубый чем точность timestamp.

Можно воспользоваться советом от 22231474. В базовом варианте Ansi-SQL
любое сравнение с Null дает либо неопределённость либо false. Вобщем надо покумекать
какую таблицу истинности даст SELECT для трех вариантов интервала. Открытый слева.
Открытый справа. Закрытый.

Можно перенести логику проверки условия на бесконечность в SQL в виде switch/case
выражения типа.

      CASE  
         WHEN fr is NULL THEN fr = date '2038-01-01 00:00:00'
         ELSE fr
       END  


В этом случае она уходит из Java кода. Возможно будет красивее.
18 ноя 20, 18:04    [22234819]     Ответить | Цитировать Сообщить модератору
 Re: Немного SQL перенести на хибер  [new]
вадя
Member

Откуда: Екатеринбург
Сообщений: 18324
mayton
В этом случае она уходит из Java кода. Возможно будет красивее.
я это предложил ещё много страниц назад
18 ноя 20, 23:05    [22234993]     Ответить | Цитировать Сообщить модератору
 Re: Немного SQL перенести на хибер  [new]
Zzz79
Member

Откуда:
Сообщений: 1005
вадя
mayton
В этом случае она уходит из Java кода. Возможно будет красивее.
я это предложил ещё много страниц назад

такое не прокатит - очень большой объем данных
для проектов уровня петро проктит,в моем случае нет)
18 ноя 20, 23:10    [22234997]     Ответить | Цитировать Сообщить модератору
 Re: Немного SQL перенести на хибер  [new]
вадя
Member

Откуда: Екатеринбург
Сообщений: 18324
Zzz79,

кто это тебе скзал?
ты сначала проверь
18 ноя 20, 23:17    [22234999]     Ответить | Цитировать Сообщить модератору
 Re: Немного SQL перенести на хибер  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 6525
вадя,
Ну я помню его проект цветочного магазина. Где юзвери были строками ФИО без FK))))
19 ноя 20, 08:07    [22235071]     Ответить | Цитировать Сообщить модератору
 Re: Немного SQL перенести на хибер  [new]
вадя
Member

Откуда: Екатеринбург
Сообщений: 18324
PetroNotC Sharp
Ну я помню его проект цветочного магазина. Где юзвери были строками ФИО без FK))))
ну если только так
19 ноя 20, 08:21    [22235076]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: 1 2 3 4 5 6 7 8 9 10      [все]
Все форумы / Java Ответить