Problem z sortowaniem za pomocą Specification

0

Hibernate robi mi tekie query

select
        distinct category0_.id as id1_4_,
        category0_.title as title2_4_
    from
        categories category0_ 
    left outer join
        products products1_ 
            on category0_.id=products1_.category_id 
    order by
        products1_.removed_at desc limit ?

Encja:

@Table(name = "categories")
public class Category {
	@Id
	@Column
	@GeneratedValue(strategy = GenerationType.IDENTITY)
	private int id;


	@Column
	private String title;


	@OneToMany(fetch = FetchType.LAZY)
	@JoinColumn(name = "category_id")
	private Set<Product> products;

i do tego w service mam:

Specification<Category> categorySpecification = (root, criteriaQuery, criteriaBuilder) -> {
			 criteriaQuery.distinct(true);
			 return null;
		 };

i dostaję błąd w stylu: "ORDER BY clause is not in SELECT list". Gdy wykonuję zapytanie "na boku" to leci ten sam bład a to przez to że w select'cie nie dodaje "products1_.removed_at" - pytanie jak to zrobić czy za pomocą adnotacji jakoś w encji się da czy może specification jakoś trzeba zmodyfikować?

1

A jak wyrzucisz criteriaQuery.distinct(true);?

https://github.com/Piwigo/Piwigo/issues/376#issuecomment-160658716

0

@Charles_Ray: próbowałem ale wtedy dostaje te same obiekty kilka razy

1

To wrzuć w Seta ;) Najwidoczniej Twój engine bazy danych nie umie jednocześnie distinct i order by - co jest dziwne BTW.

0

@Charles_Ray: ale co wrzucić w Set'a? w encji to mam właśnie Set'a
a mysql od 5.7 ma "ONLY_FULL_GROUP_BY" https://stackoverflow.com/questions/36829911/how-to-resolve-order-by-clause-is-not-in-select-list-caused-mysql-5-7-with-sel/52700392
i dlatego nie działa, a nie chce zmieniać sql_mode, myslę nad innym rozwiązaniem

2

Sugeruje zrobić na piechotę czyli native SQL, skoro już do tego stopnia abstrakcja cieknie ;) inne rozwiązanie nie będzie utrzymywalne na dłuższa metę (np. może da się sztucznie dodać order by id w tej specyfikacji - to jest w końcu Criteria API).

Hint: Set usuwa duplikaty. Rozumiem, ze po usunięciu distinct dostajesz kilka razy te same encje. Wrzuć je do Seta albo ich id i w ten sposób dostaniesz unikalne - voila! FAANG jest Twój.

0

Nie wrzuce do Seta bo ilość oczekiwanych wyników sie zmieni - będzie mniej. To musi dziać się już w zapytaniu

0

No to tak jak napisałem - albo obejście dodając

CriteriaQuery.orderBy(„removedAt”).orderBy(„id”)

albo nejtiw sikuel.

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