Size: a a a

Java Web and more

2020 September 13

A

Aaa4 in Java Web and more
Роман Нагаев
почему? я пока не ловил плюсов от скрытия связки кроме небольшого упрощения связей а вот неявных проблем пару раз отхватил
Т.е. под таблицу связи писать отдельную сущность и если нужно делать апдейт апдейтить через нее ручками? (ну, это мы некоторый экзотический случай рассматриваем?)
источник

РН

Роман Нагаев... in Java Web and more
Aaa4
Т.е. под таблицу связи писать отдельную сущность и если нужно делать апдейт апдейтить через нее ручками? (ну, это мы некоторый экзотический случай рассматриваем?)
ага, но это не экзотический случай, вот мой опыт
1) как я уже написал если понадобится добавить потом новое поле в связку, придётся переделать это и всё что от неё зависит
2) у меня возникали проблемы с настройкой стратегии загрузки, джойн тейбл у меня по дефолту джойнит, независимо от того ленивая связь или нет, и настроить селект с батчем не получилось
источник

AE

Alexandr Emelyanov in Java Web and more
Роман Нагаев
почему? я пока не ловил плюсов от скрытия связки кроме небольшого упрощения связей а вот неявных проблем пару раз отхватил
Я делаю явную только когда оно требуется, например ввести порядок, а так при запросах в jpql эта сущность не нужна, вообще ни разу. Как и в описанной задаче
источник

AE

Alexandr Emelyanov in Java Web and more
Роман Нагаев
ага, но это не экзотический случай, вот мой опыт
1) как я уже написал если понадобится добавить потом новое поле в связку, придётся переделать это и всё что от неё зависит
2) у меня возникали проблемы с настройкой стратегии загрузки, джойн тейбл у меня по дефолту джойнит, независимо от того ленивая связь или нет, и настроить селект с батчем не получилось
2. ОРУ. Ты проверь как equals и hashCode сделаны, сто процентов там у тебя ломбок и ты не исключил
источник

AE

Alexandr Emelyanov in Java Web and more
Aaa4
не, таблица связи просто join_table у меня прописана в мэппинге. У нее сущности @Entity нет.
@ManyToMany(cascade = {CascadeType.REFRESH, CascadeType.PERSIST, CascadeType.MERGE})
   @JoinTable(name = "article_category",
           joinColumns = {@JoinColumn(name = "article_id")},
           inverseJoinColumns = {@JoinColumn(name = "category_id")})
   private List<Category> categories = new ArrayList<>();
кстати здесь должен быть set, а не list
источник

AE

Alexandr Emelyanov in Java Web and more
Тебе надо что бы обе категории одновременно были?
источник

A

Aaa4 in Java Web and more
ну вообще да 2 или более :)
источник

AE

Alexandr Emelyanov in Java Web and more
Aaa4
ну вообще да 2 или более :)
Т.е. тебе надо найти все, у которых есть перечисленный список категорий?
источник

A

Aaa4 in Java Web and more
Alexandr Emelyanov
Т.е. тебе надо найти все, у которых есть перечисленный список категорий?
да
источник

A

Aaa4 in Java Web and more
Alexandr Emelyanov
Т.е. тебе надо найти все, у которых есть перечисленный список категорий?
я еще с джойнами пробовал но потом спросил про джойны в sql чате, там говорили так не делать и вообще никому это не показывать больше :(
источник

RS

Ruslan Stelmachenko in Java Web and more
Вот такой JPQL по идее должен работать. Но я не уверен, нет под рукой ничего, на чем потестить.

SELECT a FROM article a
WHERE (SELECT COUNT(c) FROM a.categories c where c.id in ('32', '34')) >= 2
источник

AE

Alexandr Emelyanov in Java Web and more
Aaa4
я еще с джойнами пробовал но потом спросил про джойны в sql чате, там говорили так не делать и вообще никому это не показывать больше :(
ну тут боюсь что как и в нативном запросе на каждую категорию условие вхождение через and писать только
источник

A

Aaa4 in Java Web and more
Ruslan Stelmachenko
Вот такой JPQL по идее должен работать. Но я не уверен, нет под рукой ничего, на чем потестить.

SELECT a FROM article a
WHERE (SELECT COUNT(c) FROM a.categories c where c.id in ('32', '34')) >= 2
оу, это having count Так пишется ? " >= ", спасибо
источник

RS

Ruslan Stelmachenko in Java Web and more
Да в SQL тоже так можно, без HAVING
источник

AE

Alexandr Emelyanov in Java Web and more
Ruslan Stelmachenko
Вот такой JPQL по идее должен работать. Но я не уверен, нет под рукой ничего, на чем потестить.

SELECT a FROM article a
WHERE (SELECT COUNT(c) FROM a.categories c where c.id in ('32', '34')) >= 2
кстати да
источник

A

Aaa4 in Java Web and more
Alexandr Emelyanov
кстати да
unexpected token: ( near line 1, column 56 [SELECT a FROM github.aaa4.server.entity.Article aWHERE (SELECT COUNT(c) FROM a.categories c where c.id in ('32', '34')) >= 2]
так же как и на обычный having count(*)=2 ругается
источник

AE

Alexandr Emelyanov in Java Web and more
Aaa4
unexpected token: ( near line 1, column 56 [SELECT a FROM github.aaa4.server.entity.Article aWHERE (SELECT COUNT(c) FROM a.categories c where c.id in ('32', '34')) >= 2]
так же как и на обычный having count(*)=2 ругается
пробел между a и where?
источник

A

Aaa4 in Java Web and more
Alexandr Emelyanov
пробел между a и where?
таки да, оно работает, спс )
источник

A

Aaa4 in Java Web and more
Ruslan Stelmachenko
Да в SQL тоже так можно, без HAVING
спс, починилось
источник

RS

Ruslan Stelmachenko in Java Web and more
Только учтите, что 2 EXIST-а через AND скорее всего работать будут быстрее.
Тут все зависит от того, на сколько конкретная БД сумеет понять, что COUNT нужно перестать считать, как только он достигнет двух. Ну и от кол-ва категорий в таблице, конечно.
источник