Adnotacja @Where w relacji @ManyToOne nie działa

Adnotacja @Where w relacji @ManyToOne nie działa
W1
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 73
0

Hej wszystkim,
próbuje użyć hibernatowej adnotacji Where w relacji ManyToOne. Chciałbym zwrócić tylko te newsy któych User ma pole active na true. Jest to projekt uzywający quarkusa. Może w ogóle nie jest możliwe połączenie tej metody z zapytaniem query w repozutorium ?

Kopiuj
@Entity
@Table(name = "user_news")
@Getter
@Setter
@Builder
@NoArgsConstructor
@AllArgsConstructor
@EqualsAndHashCode(onlyExplicitlyIncluded = true)
public class UserNews {

    @Id
    @GeneratedValue(strategy = IDENTITY)
    @EqualsAndHashCode.Include
    private Long id;

    @Column(updatable = false, insertable = false)
    @EqualsAndHashCode.Include
    @NaturalId
    private UUID uuid;

    @Where(clause = "active = true")
    @NotNull
    @ManyToOne(fetch = LAZY)
    @JoinColumn(name = "user_id")
    private UserEntity user;

}

@Entity
@Table(name = "users")
@Getter
@Setter
@NoArgsConstructor
@EqualsAndHashCode(callSuper = true)
public class UserEntity extends PersonEntity {

    @NotNull
    @Column(unique = true)
    @NaturalId
    private UUID uuid;

    @Column(name = "is_active")
    private boolean active;
    }

strzelam tym zapytaniem do repo:

Kopiuj
     @Override
     public List<UserNews> getByUserUuid(UUID uuid) {
        return find("user.uuid = ?1", uuid).list();
     }
K5
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 1005
5

Dlaczego w repozytorium nie możesz dodać metody z własnym query, w którym dodasz po prostu ten warunek where bez bawienia się w magiczne adnotacje?

W1
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 73
0
kixe52 napisał(a):

Dlaczego w repozytorium nie możesz dodać metody z własnym query, w którym dodasz po prostu ten warunek where bez bawienia się w magiczne adnotacje?

tak oczywiście takie rozwiązanie działa, ale chciałbym to zoptymalizować, żeby działało we wszystkich innych przypadkach w relacji z Userem.

K5
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 1005
1
witu12 napisał(a):

tak oczywiście takie rozwiązanie działa, ale chciałbym to zoptymalizować, żeby działało we wszystkich innych przypadkach w relacji z Userem.

Chyba nie rozumiem. Co to za przypadki gdy nie działa?

Co do pytania głównego, tutaj: https://stackoverflow.com/questions/56770986/can-i-use-where-annotation-along-with-manytoone-association Pan mówi że się nie da.

W1
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 73
0

hmmm a może adnotacja WhereJoinTable ? może ktoś się jeszcze wypowie ? :)

ZD
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 2310
1
witu12 napisał(a):
kixe52 napisał(a):

Dlaczego w repozytorium nie możesz dodać metody z własnym query, w którym dodasz po prostu ten warunek where bez bawienia się w magiczne adnotacje?

tak oczywiście takie rozwiązanie działa, ale chciałbym to zoptymalizować, żeby działało we wszystkich innych przypadkach w relacji z Userem.

Typowe przerośnięte oczekiwanie co do encji. Wyciąganie wg aktywności to rola repozytorium
a ogóle użyj lekkiego mapera (ostatnio było kilka wątków o JOOQ i JDBI), to Hibernate tu pasuje jak pięść do nosa.

PI
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 2787
2

Jak i tak masz repo, to zamień w ogóle pole user w klasie UserNews na userUuid i tyle, problem solved. A w repo (Spring Data) wtedy masz

Kopiuj
public Set<UserNews> findAllByUserUuid(UUID userUuid);
W1
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 73
0
Pinek napisał(a):

Jak i tak masz repo, to zamień w ogóle pole user w klasie UserNews na userUuid i tyle, problem solved. A w repo (Spring Data) wtedy masz

Kopiuj
public Set<UserNews> findAllByUserUuid(UUID userUuid);

to akurat projekt quarkusowy

FE
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 3
0
witu12 napisał(a):

hmmm a może adnotacja WhereJoinTable ? może ktoś się jeszcze wypowie ? :)

Tak z ciekawości to jakie idzie faktycznie z tego find zapytanie?
Poza tym w dokumentacji jest "Where clause to add to the element Entity or target entity of a collection. The clause is written in SQL.", czyli is_active = true

aolo23
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 186
2

Kolega opanował dobrze nawalanie adnotacji :P
8 pod rząd - niezła choinka :P
Teraz jako 2 zadanie możesz się zastanowić jak to poprawić :P Najłatwiej wywalając loomboka :P

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.