Как извлечь конкретный столбец из таблицы - JPA или CrudRepository? Я хочу получить только столбец электронной почты из таблицы пользователя

0

Модель пользователя

@Entity
@Table(name = "user",uniqueConstraints = {@UniqueConstraint(columnNames = {"email"}) })
public class User implements Serializable{

    /**
     * 
     */
    private static final long serialVersionUID = 382892255440680084L;

    private int id;
    private String email;
    private String userName;

    private Set<Role> roles = new HashSet<Role>();

    public User() {}

    }

Мой соответствующий пользовательский репо:

    package hello.repository;

    import org.springframework.data.repository.CrudRepository;

    import hello.model.User;

    public interface UserRepository extends CrudRepository<User,Long> {

    }

В контроллере я делаю:

@GetMapping(path="/all")
    public @ResponseBody Iterable<User> getAllUsers() {
        // This returns a JSON or XML with the users
        return userRepository.findAll();
    }

Я нахожу, что это извлекает всю таблицу пользователей. Но это не то, что я хочу. Мое требование - это только столбец электронной почты из таблицы пользователя.

Как получить только электронную почту из таблицы пользователей? ---> SQL Query, как SELECT электронная почта от пользователя;

  • 0
    Вы пишете метод, аннотированный @Query , и в качестве значения этой аннотации вы указываете @Query запрос. docs.spring.io/spring-data/jpa/docs/current/reference/html/… . Кажется, вы не читали документацию. Почему не ты?
Теги:
spring-boot
spring
spring-data-jpa
crud

2 ответа

1
Лучший ответ

Создайте запрос с помощью @Query annoatation в вашем UserRepository следующим образом:

public interface UserRepository extends CrudRepository<User,Long> {
   @Query("select u.email from User u")
   List<String> getAllEmail();
}

И назовите его в своем контроллере

@GetMapping(path="/user/email")
public @ResponseBody List<String> getAllEmail() {
    return userRepository.getAllEmail();
}
  • 0
    Спасибо !! Это беспокоит
0

Если вы не хотите писать запрос, вы можете использовать прогнозы для получения только необходимых вам полей:

public interface UserProjection {
    String getEmail();
}

public interface UserRepo extends CrudRepository<User, Long> {

   List<UserProjection> getUserDtoBy();
   Projection getUserDtoById(Long userId);

   // Even in dynamic way:
   <T> List<T> getUserDtoBy(Class<T> type);
   <T> T getUserDtoById(Long userId, Class<T> type);
}

Затем он выбирает только указанные поля. В приведенном выше примере проектирования он сделает запрос SQL следующим образом:

select p.email from users u ...

Например, вы всегда можете указать свой пользовательский запрос, чтобы выбрать только одно поле (как сказал @AjitSoman):

@Query("select distinct u.email from User u)
List<String> getAllEmails();

(Я думаю, что здесь не нужны дублирующие значения...)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню