JPA - problem z zapytaniem

0

Proszę o pomoc w napisaniu zapytania, które pobrało by mi pierwszych 10 userów z bazy danych i posortowało ich w zależności od tego czy posiadają pliki, czy nie (może być według ilości posiadanych plików). Niżej podaję uproszczone klasy encji

@Entity
public class User implements Serializable {
	private static final long serialVersionUID = 1L;

	@Id
	@GeneratedValue (strategy = GenerationType.IDENTITY)
	@Column(name="ID")
	private int id;

	@Column(name="NAZWA")
	private String nazwa;

	//bi-directional many-to-one association to PlikiUsera
	@OneToMany(mappedBy="user")
	private Set<PlikiUsera> plikiUsera = new HashSet<PlikiUsera>();

	//gerrery i settery
}

@Entity
@Table(name="PLIKI_USERA")
public class PlikiUsera implements Serializable {
	private static final long serialVersionUID = 1L;

	@Id
	@GeneratedValue (strategy = GenerationType.IDENTITY)
	@Column(name="ID")
	private int id;

	@Column(name="DATA_PLIKU")
	private Timestamp dataPliku;

    @ManyToOne
	@JoinColumn(name="ID_USE")
	private User user;

	@OneToOne(fetch=FetchType.LAZY)
	@JoinColumn(name="ID_PL")
	private Pliki pliki;

	//gettery i settery
}

Próbowalem robić w taki sposób, ale niestety nie dziala:

 SELECT u FROM User u LEFT OUTER JOIN u.plikiUsera pliki ORDER BY count(pliki)

Do ograniczenia ilości pobranych userów używam metod setFirstResult(first); i setMaxResults(pageSize);

0

Odpowiedź jak to zrobić jest tutaj ("To order a result by the size of a collection, use the following query"):
http://docs.jboss.org/hibernate/core/3.3/reference/en/html_single/#queryhql-tipstricks

0

Napisałem takie zapytanie, ale niestety dalej nie działa:

 SELECT u FROM USER u LEFT JOIN u.plikiUsera pliki GROUP BY u.id ORDER BY COUNT(pliki)

Niżej podaję kod błędu:
An expression in the ORDER BY clause in the following position, or starting with "COUNT..." in the "ORDER BY" clause is not valid. Reason code = "3".. SQLCODE=-214, SQLSTATE=42822, DRIVER=3.57.82

0

Twoje zapytanie grupuje po id. Jak wykorzytujesz funkcje agregujące to wszystko z selecta powinno być albo w funkcji agregującej albo w group by. Select u -> oznacza coś w rodzaju select id, nazwa, reszta attr usera.

0

Dzięki za pomoc. Już sobie poradziłem z tym zapytaniem, ale teraz mam inny problem. Chciałbym, aby wyświetliło mi userów, którzy mają co najmniej jeden plik wrzucony określonego dnia miesiąca. Jako parametr podaję tylko dzień, a nie całą datę, więc jak np podam np. "12" to powinno mi wyświetlić wszystkich userów, którzy mają plik wrzucony 12-stego dnia obojetnie jakiego miesiaca i obojetnie jakiego roku. Kompletnie nie wiem jak się za to zabrać. Ma ktoś jakiś pomysł?

0

http://docs.jboss.org/hibernate/core/3.3/reference/en/html_single/#queryhql-expressions
punkt "second(...), minute(...), hour(...), day(...), month(...), and year(...) "

lub dodać do encji osobne pole z dniem w miesiącu (to rozwiązanie pewnie będzie szybsze)

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