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)