Вы можете установить nativeQuery = true в annotations @Query из classа Repository следующим образом:
public static final String FIND_PROJECTS = "SELECT projectId, projectName FROM projects"; @Query(value = FIND_PROJECTS, nativeQuery = true) public List
Обратите внимание, что вам придется самому делать картографирование. Вероятно, проще просто использовать обычный сопоставленный поиск, например, если вам действительно нужны только эти два значения:
public List findAll()
Вероятно, стоит посмотреть и на документальные данные Spring.
Мне особенно не нравится синтаксис (он выглядит немного взломанным …), но это самое элегантное решение, которое я смог найти (он использует пользовательский запрос JPQL в classе репозитория JPA):
@Query("select new com.foo.bar.entity.Document(d.docId, d.filename) from Document d where d.filterCol = ?1") List findDocumentsForListing(String filterValue);
Тогда, конечно, вам просто нужно предоставить конструктор для документа, который принимает имя docId & filename в качестве аргументов конструктора.
Вы можете использовать проекции из Spring Data JPA (doc) . В вашем случае создайте интерфейс:
В моем случае я создал отдельный class сущности без полей, которые не требуются (только с полями, которые необходимы).
Сопоставьте объект с той же таблицей. Теперь, когда требуются все столбцы, я использую старый объект, когда требуются только некоторые столбцы, я использую объект Lite.
@Entity @Table(name = "user") Class UserLite{ @Column(name = "id", unique=true, nullable=false) int id; @Column(name = "name", nullable=false) String name; }
Это работает, когда вы знаете столбцы для извлечения (и это не изменится).
не будет работать, если вам нужно динамически решать столбцы.
В моей ситуации мне нужен только результат json, и это работает для меня:
public interface SchoolRepository extends JpaRepository { @Query("select s.id, s.name from School s") List
в controllerе:
@Autowired private SchoolRepository schoolRepository; @ResponseBody @RequestMapping("getschoolidandname.do") public List
Я думаю, что простым способом может быть использование QueryDSL , который поставляется с Spring-Data.
Используя ваш вопрос, можно ответить
JPAQuery query = new JPAQuery(entityManager); List result = query.from(projects).list(project.projectId, project.projectName); for (Tuple row : result) { System.out.println("project ID " + row.get(project.projectId)); System.out.println("project Name " + row.get(project.projectName)); }}
Диспетчер объектов может быть Autowired, и вы всегда будете работать с объектами и кланами без использования * языка QL.
Как вы можете видеть в ссылке, последний выбор кажется почти для меня более элегантным, то есть с использованием DTO для сохранения результата. Примените к вашему примеру, который будет:
JPAQuery query = new JPAQuery(entityManager); QProject project = QProject.project; List dtos = query.from(project).list(new QProjectDTO(project.projectId, project.projectName));
Определение ProjectDTO как:
class ProjectDTO { private long id; private String name; @QueryProjection public ProjectDTO(long projectId, String projectName){ this.id = projectId; this.name = projectName; } public String getProjectId(){ ... } public String getProjectName(){....} }
Using Spring Data JPA there is a provision to select specific columns from database ---- In DAOImpl ---- @Override @Transactional public List getAllEmployee() throws Exception { LOGGER.info("Inside getAllEmployee"); List empList = empRepo.getNameAndCityOnly(); return empList; } ---- In Repo ---- public interface EmployeeRepository extends CrudRepository { @Query("select e.name, e.city from Employee e" ) List getNameAndCityOnly(); } It worked 100% in my case. Thanks.
В исходном sql можно указать значение null как значение поля.
@Query(value = "select p.id, p.uid, p.title, null as documentation, p.ptype " + " from projects p " + "where p.uid = (:uid)" + " and p.ptype = 'P'", nativeQuery = true) Project findInfoByUid(@Param("uid") String uid);
Вы можете применить приведенный ниже код в своем classе интерфейса репозитория.
entityname означает имя вашей базы данных, например, проекты. И List означает, что Project – это class Entity в ваших проектах.
@Query(value="select p from #{#entityName} p where p.id=:projectId and p.projectName=:projectName") List findAll(@Param("projectId") int projectId, @Param("projectName") String projectName);
Вы можете использовать JPQL:
TypedQuery query = em.createQuery( "SELECT p.projectId, p.projectName FROM projects AS p", Object[].class); List results = query.getResultList();
или вы можете использовать собственный SQL-запрос.
Query query = em.createNativeQuery("sql statement"); List results = query.getResultList();
Использование собственного запроса:
Query query = entityManager.createNativeQuery("SELECT projectId, projectName FROM projects"); List result = query.getResultList();
Большинство ответов здесь предлагают использовать некоторые варианты собственного SQL-запроса. Однако, используя встроенные данные весны jpa, мы можем это сделать:
Вам просто нужно использовать следующую подпись метода в classе репозитория.
В зависимости от схемы он может вернуть список или один экземпляр. Этот подход может применяться к одиночным или нескольким столбцам, как показано выше.