Spring JPAselect特定的列

我正在使用Spring JPA执行所有数据库操作。 但是我不知道如何从Spring JPA的表中select特定的列?

例如:
SELECT projectId, projectName FROM projects

您可以在Repository类的@Query注释中设置nativeQuery = true ,如下所示:

 public static final String FIND_PROJECTS = "SELECT projectId, projectName FROM projects"; @Query(value = FIND_PROJECTS, nativeQuery = true) public List<Object[]> findProjects(); 

请注意,你将不得不自己做映射。 使用像这样的常规映射查找可能更容易,除非您真的只需要这两个值:

 public List<Project> findAll() 

Spring数据文档也是值得一看的。

我不喜欢特别的语法(它看起来有点hacky …),但这是我能find的最优雅的解决scheme(它在JPA存储库类中使用自定义的JPQL查询):

 @Query("select new com.foo.bar.entity.Document(d.docId, d.filename) from Document d where d.filterCol = ?1") List<Document> findDocumentsForListing(String filterValue); 

那么当然,你只需要提供一个Document接受docId&filename作为构造器参数的构造函数。

你可以使用Spring Data JPA (doc)中的投影。 在你的情况下,创build接口:

 interface ProjectIdAndName{ String getId(); String getName(); } 

并将以下方法添加到您的存储库

 List<ProjectIdAndName> findAll(); 

在我的情况下,我只需要json的结果,这对我有用:

 public interface SchoolRepository extends JpaRepository<School,Integer> { @Query("select s.id, s.name from School s") List<Object> getSchoolIdAndName(); } 

在控制器中:

 @Autowired private SchoolRepository schoolRepository; @ResponseBody @RequestMapping("getschoolidandname.do") public List<Object> getSchool() { List<Object> schools = schoolRepository.getSchoolIdAndName(); return schools; } 

在我的情况下,我创build了一个单独的实体类,没有不需要的字段(只有与需要的字段)。

将实体映射到同一个表。 现在,当所有的列都需要我使用旧的实体,当只有一些列是必需的,我使用精简实体。

例如

 @Entity @Table(name = "user") Class User{ @Column(name = "id", unique=true, nullable=false) int id; @Column(name = "name", nullable=false) String name; @Column(name = "address", nullable=false) Address address; } 

你可以创build类似于:

 @Entity @Table(name = "user") Class UserLite{ @Column(name = "id", unique=true, nullable=false) int id; @Column(name = "name", nullable=false) String name; } 

当你知道要获取的列时(这个不会改变),这是有效的。

如果您需要dynamic决定列,将不起作用。

我想简单的方法可能是使用Spring-Data附带的QueryDSL 。

用你的问题答案可以

 JPAQuery query = new JPAQuery(entityManager); List<Tuple> 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)); }} 

实体pipe理器可以是自动assembly的,而且你总是可以在不使用* QL语言的情况下使用对象和类。

正如你可以在链接中看到的最后一个select似乎,几乎对我来说,更优雅,就是用DTO来存储结果。 适用于你的例子:

 JPAQuery query = new JPAQuery(entityManager); QProject project = QProject.project; List<ProjectDTO> 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(){....} } 

你可以使用JPQL:

 TypedQuery <Object[]> query = em.createQuery( "SELECT p.projectId, p.projectName FROM projects AS p", Object[].class); List<Object[]> results = query.getResultList(); 

或者你可以使用原生的SQL查询。

 Query query = em.createNativeQuery("sql statement"); List<Object[]> results = query.getResultList(); 
 Using Spring Data JPA there is a provision to select specific columns from database ---- In DAOImpl ---- @Override @Transactional public List<Employee> getAllEmployee() throws Exception { LOGGER.info("Inside getAllEmployee"); List<Employee> empList = empRepo.getNameAndCityOnly(); return empList; } ---- In Repo ---- public interface EmployeeRepository extends CrudRepository<Employee,Integer> { @Query("select e.name, e.city from Employee e" ) List<Employee> 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); 

您可以将下面的代码应用到您的存储库接口类中。

entityname意味着你的数据库表名像项目一样。 列表意味着项目是项目中的实体类。

 @Query(value="select p from #{#entityName} p where p.id=:projectId and p.projectName=:projectName") List<Project> findAll(@Param("projectId") int projectId, @Param("projectName") String projectName); 

使用原生查询:

 Query query = entityManager.createNativeQuery("SELECT projectId, projectName FROM projects"); List result = query.getResultList();