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