Adnotacja @Where w relacji @ManyToOne nie działa

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 ?

@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:

     @Override
     public List<UserNews> getByUserUuid(UUID uuid) {
        return find("user.uuid = ?1", uuid).list();
     }
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?

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.

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.

0

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

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.

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

public Set<UserNews> findAllByUserUuid(UUID userUuid);
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

public Set<UserNews> findAllByUserUuid(UUID userUuid);

to akurat projekt quarkusowy

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

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

1 użytkowników online, w tym zalogowanych: 0, gości: 1