Spring данные JPA для возврата определенных полей

Есть ли у Spring Data механизм для возврата определенных полей?

Я знаком с синтаксисом:

Invoice findByCode(String code);

Как насчет этого:

Integer findIdByCode(String code);

который возвращает только поле id. Или

Tuple findIdAndNameByCode(String code);

который возвращает кортеж. Или

Invoice findIdAndNameByCode(String code);

который возвращает объект, заполненный только определенными полями. Может использовать конструктор, берущий только те поля, если они определены - иначе построить пустое и заполнить поля.

ИЗМЕНИТЬ

Чтобы получить еще что-то, я знаю о таких решениях, как @Query, выражения конструктора и теперь @NamedEntityGraph. Мой вопрос просто - данные Spring поддерживают такой сокращенный синтаксис, который я предлагаю?

Если нет, возможно, это классное усовершенствование для более поздней версии...

Я не ищу обходные пути.

Ответ 1

Вы можете использовать выражения конструктора JPQL:

SELECT NEW com.company.PublisherInfo(pub.id, pub.revenue, mag.price)
    FROM Publisher pub JOIN pub.magazines mag WHERE mag.price > 5.00

Имя конструктора должно быть полностью квалифицированным

Ответ 2

Если вы хотите вернуть только 1 поле из таблицы, и это примитив (или autoboxing), вы можете использовать следующее:

@Query("select distinct t.locationId from Table t")
List<Long> findAllWashroomLocationId();

Где:

  • Таблица - имя класса, представляющего вашу таблицу
  • t - псевдоним
  • locationId - имя поля (в вашем объекте Table)
  • Долгий тип locationId (Integer, String,...)

Ответ 3

Не уверен, что то, что вы пытаетесь достичь, такое же, как использование нескольких проекций в одном и том же запрошенном JPA запросе (где имя метода совпадает). Я опубликовал ответ в этом сообщении.

fooobar.com/info/552578/...

Итак, мне удалось выяснить, как использовать несколько проекций с одиночный запрос.

<T> T getByUsername(String username, Class<T> projection) This allows the method caller to specified the type of projection to be

примененный к запросу.

Чтобы еще больше улучшить это, он менее подвержен ошибкам, я сделал пустой интерфейс, чтобы проекция должна была расширяться, чтобы иметь возможность для вставки класса в параметр.

public interface JPAProjection {
}

public interface UserRepository extends CrudRepository<UserAccount, Long> {
    <T extends JPAProjection > T getByUsername(String username, Class<? extends JPAProjection> projection);
}

Интерфейс проецирования

public interface UserDetailsProjection extends JPAProjection{
    @Value("#{target.username}")
    String getUsername();

    @Value("#{target.firstname}")
    String getFirstname();

    @Value("#{target.lastname}")
    String getLastname();
}

Затем я могу вызвать метод запроса

getByUsername("...", UserDetailsProjection.class)