Top5 na podstawie rozmiaru kolekcji

0

Cześć,

Chciałbym zrobić zapytanie używając spring data które wyciągnie mi top 5 rekordów na podstawie rozmiaru kolekcji.
Mniej więcej coś takiego: List<Stock> findTop5ByUsersSize() ?
Moja encja wygląda tak:

public final class Stock implements Serializable {

<inne pola>

	@JsonIgnore
	@ManyToMany(mappedBy = "stocks", fetch = FetchType.LAZY)
	private Set<User> users = new HashSet<>();

<getters/setters>
}

Jest to w ogóle możliwe w spring-data? nie użwyajać query lub native query?

0

Ok, dzięki liczyłem na to, że jednak obejdzie się bez query ;)

0

Da się i bez zapytania:

List<Stock> findFirst5ByUserId(Long userId, Sort sort);
List<Stock> findTop5ByUserId(Long userId, Pageable pagable);

generalnie > http://docs.spring.io/spring-data/jpa/docs/current/reference/html/#repositories.limit-query-result

0

Tak korzystałem z tej strony. Tak wiem, że tak można ale chyba nie o to mi chodzi. Chciałbym wyciągnąć top5 spółek nie dla konkretnego usera tylko dla wszystkich userów. W takim wypadku chyba muszę użyć query.

0

@podroznik na listingu druga metoda od góry

List<Stock> findTop5();

powinno dać odpowiedni rezultat.

0

To springowe reposiotory to dość ciekawy twór z automatycznym generowaniem query przez konwencję nazewniczą. Ale raczej łatwo o pomyłkę, bez dobrego wsparcia IDE.

Czy generowanie zapytań bez Query w repository jest sensownie wspierane w IDE? Jakie IDE/plugin jest do tego potrzebny? Czy obejdzie się bez IntelliJ? Przypomina to troszeczkę dynamiczny ORM w Grails.

Jeśli nie ma dobrego wsparcia w IDE raczej wolę pozostać przy JPQL/HQL (lepsza czytelność) i używać co najwyżej CrudRepository do najprostszych, elementarnych operacji.

0
Koziołek napisał(a):

@podroznik na listingu druga metoda od góry

List<Stock> findTop5();

powinno dać odpowiedni rezultat.

@Koziołek

Chyba się nie rozumiemy albo ja jestem jakiś nieogarnięty. Skąd repo będzie wiedziało że ma mi podać top5 na podstawie rozmiaru kolekcji? Jak dla mnie takie zapytanie powinno wyglądać mniej wiecej tak: findTop5ByOrderByUsersSizeDesc();

Tutaj native query jakie napisałem do bazy żeby zobrazować o co mi chodzi:

SELECT s.ticker, COUNT(s.ticker)
FROM t_stock s INNER JOIN t_user_stocks us ON s.id = us.stock_id 
INNER JOIN t_user u on us.user_id = u.id GROUP BY s.ticker ORDER BY count DESC

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