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();