Проектирование данных Spring JPA с выбором - PullRequest
0 голосов
/ 09 января 2019

У меня есть таблица базы данных, которая содержит метаданные для документов. Моя задача сейчас - получить список с типами документов. Типы документов не являются уникальными в таблице базы данных, но, конечно, я хочу, чтобы они были в моем списке. Sql очень прост:

SELECT DISTINCT groupname, group_displayorder
FROM t_doc_metadata
ORDER BY group_displayorder;

Я узнал, что могу использовать проекции для получения подмножества полей из моей сущности DocMetadata. Я решил это следующим образом. Моя сущность:

@Entity
@Table(name="T_DOC_METADATA")
@Data
public class DocMetadata {
..............

    @Column(nullable=false)
    private String displayname;

    @Column(nullable=false)
    private Integer displayorder;

    @Column(nullable=false)
    private String groupname;

    @Column(name="GROUP_DISPLAYORDER",
        nullable=false)
    private Integer groupDisplayorder;

    @Column(name="METADATA_CHANGED_TS",
        nullable=false,
        columnDefinition="char")
    private String metadataChangedTimestamp;
..........
}

Мой интерфейс для проецирования:

public interface GroupnameAndOrder {

    String getGroupname();
    Integer getGroupDisplayorder();
    void setGroupname(String name);
    void setGroupDisplayorder(int order);
}

Теперь я подумал, что буду необычайно умен, добавив в свой репозиторий следующие строки:

@Query("select distinct d.groupname, d.groupDisplayorder from DocMetadata d order by d.groupDisplayorder")  
public List<GroupnameAndOrder> findSortedGroupnames();

К сожалению, при переборе списка результатов и вызове getGroupname () результат равен нулю.

Итак, я изменил строки в моем хранилище в соответствии с документацией:

public List<GroupnameAndOrder> findBy();

Теперь я получаю имена групп, но, конечно, они не уникальны. Так что это не решает мою проблему.

Есть ли способ получить заказанный список с уникальными именами групп?

1 Ответ

0 голосов
/ 09 января 2019

Вы пытаетесь быть слишком умным. Вместо этого просто напишите правильный метод поиска и верните GroupnameAndOrder. Затем Spring Data JPA будет извлекать только то, что необходимо для проекции.

Нечто подобное должно сработать.

List<GroupnameAndOrder> findDistinctByOrderByGroupDisplayorder();
...