Hibernate (+rest +jackson)-> Wybieranie specyficznych kolumn z OneToMany

0

Mam problem: nie wiem jak zrobić zapytanie do hibernate żeby wyfetchować specyficzne kolumny z relacji oneToMany
Mam User i Comment, mają one relacje One-To-Many, Comment trzyma FK dla Usera. Rzecz jest w tym że kiedy pobieram komentarze z bazy danych, pobiera mi się komentarz i wszystkie pola z @Entity User , A ja chce tylko część z nich pobrać, nie chce wszystkich. Jednoczesnie nie chce też takiego pola kompletnie ignorować, bo być może w innym przypadku będę chciał go użyć także coś w stylu @JsonIgnore odpada

@Entity
public class User {

@Id
@GeneratedValue
private Integer id;

private String username;

@JsonIgnore
private String password;

private String about;

@JsonIgnore
@OneToMany(mappedBy="userRef")
private List<Comment> comments;
}

Comment Entity

@Entity
public class Comment {

@Id
@GeneratedValue
private Long id;

private String text;

@ManyToOne
@JoinColumn(name="author_id")
private User userRef;
[...] inne bla bla
}

I pobieram wyniki z bazy

 session.createQuery("from Comment").getResultList();

To co powyżej zwraca to:

[
  {
    "id": 1,
    "text": "Some comment text",
    "userRef": {
      "id": 1,
      "username": "some_username",
      "about": "(** TEGO TU BYĆ NIE POWINNO **) Something about user"
    }
  }
]

Taki zwrot JSON'a chce

[
  {
    "id": 1,
    "text": "Some comment text",
    "userRef": {
      "id": 1,
      "username": "some_username"
    }
  }
]

Wiem że można to zrobić pobierając wszystko jako jeden obiekt, ale chciałbym żeby userRef dalej był po prostu polem obiektu Comment, a nie latał gdzies obok niego. Bardziej w gruncie rzeczy chodzi mi tu o samo query na hibernate, wiem że moge sobie te pole w jacksonie schować, ale problem jest taki że wtedy dalej zostanie one pobrane z bazy danych, a takie rozwiązanie średnio mi podchodzi.

Z góry dzięki

1

No widzę, że nikt nie ma pomysłu. Zobacz sobie select new .... w HQL.
I zrób obiekt specyficzny do tego co chcesz pobrać ( niech ma tylko wymagane pola).
(Ogólnie select new to najbezpieczniejszy sposób odpytywanie hibernate).

1

Masz dwie opcje. Pierwsza to ta przedstawiona przez @jarekr000000. Coś w rodzaju:

Select new moj.pakiet.PojedynczyKomentarz(c.id, c.text, u.id, u.username ) From Comment c, User u Where ...

Zaletą jest kontrola co wybierasz. Wadą jest „wypłaszczenie” modelu i zredukowanie go do mapy. Po stronie javascriptu będzie trzeba strasznie dużo się napisać, by to przekuć na jakiś sensowny model.

Druga opcja to użycie mechanizmu @JSONView i konfiguracja na poziomie klasy, co i gdzie jest widoczne. Wadą w tym przypadku jest konieczność dodania adnotacji w kodzie.

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