powered by simpleCommunicator - 2.0.29     © 2024 Programmizd 02
Map
Форумы / Java [игнор отключен] [закрыт для гостей] / Stream получение данных из таблиц
4 сообщений из 4, страница 1 из 1
Stream получение данных из таблиц
    #40077559
Фотография -=Koba=-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Имеются следующие таблицы (я их упростил немного)
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
@Inheritance(strategy = InheritanceType.JOINED)
public class ParentEntity {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String type;
}

public class Child1Entity extends ParentEntity {
    private String status;
}

public class Child2Entity extends ParentEntity {
    private String status;
}

public class Child3Entity extends ParentEntity {
    private String status;
}

public class Child4Entity extends ParentEntity {
    private String status;
}

public class Child5Entity extends ParentEntity {
    private String status;
}



Таблица ParentEntity связана с ChildNEntity по Id.


Что надо сделать - хочу получить список всех id, удолетворяющие условиям

1) type будет = child1,child2,child3 (то есть в запросе будете участвовать только таблицы ParentEntity, Child1-3Entity)
2) Далее надо получить данные у которых status в таблицах Child1-3Entity равен определенному условию


Есть ли какие-нибдуь красивые решения
Я в лоб придумал

делать три стрима (поиск по трем типам в ParentEntity) и дальше объединять List<String>
Объединять на уровне стрима

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
        List<Long> ids = parentRepository.findAllByType("child1")
                .stream()
                .map(ParentEntity::getId)
                .map(child1Repository::findById)
                .filter(Optional::isPresent)
                .map(Optional::get)
                .filter(child1Entity -> child1Entity.getStatus().equals("child1Status1"))
                .map(ParentEntity::getId)
                .collect(Collectors.toList());
...
Рейтинг: 0 / 0
Stream получение данных из таблиц
    #40077577
faustgreen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
-=Koba=-, Возможно поможет HQL запрос. Что то типа:
Код: java
1.
2.
3.
4.
5.
List<Payment> payments = entityManager.createQuery(
	"select p " +
	"from Payment p " +
	"where type(p) in ( CreditCardPayment, WireTransferPayment )", Payment.class )
.getResultList();


Пример отсюда - https://docs.jboss.org/hibernate/orm/5.4/userguide/html_single/Hibernate_User_Guide.html#hql
...
Рейтинг: 0 / 0
Stream получение данных из таблиц
    #40077660
faustgreen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
List<Long> entities = entityManager.createQuery(
	" select p.id " +
	" from Parent p " +
	" left join Child1 c1 on p.id = c1.id " +
	" left join Child2 c2 on p.id = c2.id " +
	" left join Child3 c3 on p.id = c3.id " +
	" where (type(p) = Child1 and c1.status like 'Enable') " +
	"    or (type(p) = Child2 and c2.status like 'Disable') " +
	"    or (type(p) = Child3 and c3.status like 'Enable') " 
, Long.class).getResultList();
...
Рейтинг: 0 / 0
Stream получение данных из таблиц
    #40077670
faustgreen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Может кто в курсе, можно ли в примере выше обойтись без joins?

Писать что то в стиле:

Код: java
1.
... where treat(p as Child1).status = "status"


Поэксперементировал с командой treat:
Код: java
1.
2.
3.
4.
5.
6.
7.
List<Object[]> entities0 = entityManager.createQuery(
		" select treat(p as Child1).type, treat(p as Child1).status " +
		" from Parent p " +
		" where type(p) = Child1 " 
, Object[].class).getResultList();

entities0.forEach(e -> System.out.println(e[0] + " " + e[1]));


получил вот такой результат:
Код: java
1.
2.
Type1 null
Type2 null


и странный лог консоли:

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
    select
        parententi0_.type as col_0_0_,
        parententi0_1_.status as col_1_0_ 
    from
        Parent parententi0_ 
    left outer join
        Child2 parententi0_1_ 
            on parententi0_.id=parententi0_1_.id 
    left outer join
        Child5 parententi0_2_ 
            on parententi0_.id=parententi0_2_.id 
    left outer join
        Child4 parententi0_3_ 
            on parententi0_.id=parententi0_3_.id 
    inner join
        Child1 parententi0_4_ 
            on parententi0_.id=parententi0_4_.id 
    left outer join
        Child3 parententi0_5_ 
            on parententi0_.id=parententi0_5_.id 
    where
        case 
            when parententi0_1_.id is not null then 1 
            when parententi0_2_.id is not null then 2 
            when parententi0_3_.id is not null then 3 
            when parententi0_4_.id is not null then 4 
            when parententi0_5_.id is not null then 5 
            when parententi0_.id is not null then 0 
        end=4


Почему выбирется parententi0_1_.status as col_1_0_ , а не parententi0_4_.status as col_1_0_ ?
...
Рейтинг: 0 / 0
4 сообщений из 4, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / Stream получение данных из таблиц
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]