Java springjpa选择特定列

Java springjpa选择特定列,java,jpa,spring-data-jpa,Java,Jpa,Spring Data Jpa,我使用SpringJPA来执行所有数据库操作。但是我不知道如何在SpringJPA中从表中选择特定的列 例如: 从项目中选择projectId、projectName您可以使用JPQL: TypedQuery <Object[]> query = em.createQuery( "SELECT p.projectId, p.projectName FROM projects AS p", Object[].class); List<Object[]> results

我使用SpringJPA来执行所有数据库操作。但是我不知道如何在SpringJPA中从表中选择特定的列

例如:
从项目中选择projectId、projectName

您可以使用JPQL:

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

List<Object[]> results = query.getResultList();
TypedQuery query=em.createQuery(
“从项目中选择p.projectId、p.projectName作为p”,对象[].class);
List results=query.getResultList();
也可以使用本机sql查询

Query query = em.createNativeQuery("sql statement");
List<Object[]> results = query.getResultList();
Query Query=em.createNativeQuery(“sql语句”);
List results=query.getResultList();
您可以使用JPQL:

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

List<Object[]> results = query.getResultList();
TypedQuery query=em.createQuery(
“从项目中选择p.projectId、p.projectName作为p”,对象[].class);
List results=query.getResultList();
也可以使用本机sql查询

Query query = em.createNativeQuery("sql statement");
List<Object[]> results = query.getResultList();
Query Query=em.createNativeQuery(“sql语句”);
List results=query.getResultList();

您可以在
@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 static final String FIND_PROJECTS=“选择projectId,projectName FROM PROJECTS”;
@查询(value=FIND_项目,nativeQuery=true)
公共列表findProjects();
请注意,您必须自己进行映射。像这样使用常规映射查找可能更容易,除非您确实只需要这两个值:

public List<Project> findAll()
公共列表findAll()

可能也值得一看Spring数据。

您可以在
@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 static final String FIND_PROJECTS=“选择projectId,projectName FROM PROJECTS”;
@查询(value=FIND_项目,nativeQuery=true)
公共列表findProjects();
请注意,您必须自己进行映射。像这样使用常规映射查找可能更容易,除非您确实只需要这两个值:

public List<Project> findAll()
公共列表findAll()

可能也值得一看Spring数据。

我想最简单的方法可能是使用Spring数据

根据你的问题,答案可以是

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

我想最简单的方法可能是使用Spring数据

根据你的问题,答案可以是

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

我并不特别喜欢语法(它看起来有点粗糙…),但这是我能找到的最优雅的解决方案(它在JPA repository类中使用自定义JPQL查询):

@Query(“从文档d中选择新的com.foo.bar.entity.Document(d.docId,d.filename),其中d.filterCol=?1”)
列出FindDocumentsForList(字符串过滤器值);

当然,您只需要为
Document
提供一个构造函数,它接受
docId
filename
作为构造函数参数。

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

@Query(“从文档d中选择新的com.foo.bar.entity.Document(d.docId,d.filename),其中d.filterCol=?1”)
列出FindDocumentsForList(字符串过滤器值);

当然,您只需要为
Document
提供一个构造函数,它接受
docId
filename
作为构造函数参数。

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

public interface SchoolRepository extends JpaRepository<School,Integer> {
    @Query("select s.id, s.name from School s")
    List<Object> getSchoolIdAndName();
}
公共接口学校存储库扩展了JpaRepository{
@查询(“从学校s中选择s.id、s.name”)
列出getSchoolIdAndName();
}
在控制器中:

@Autowired
private SchoolRepository schoolRepository;

@ResponseBody
@RequestMapping("getschoolidandname.do")
public List<Object> getSchool() {
    List<Object> schools = schoolRepository.getSchoolIdAndName();
    return schools;
}
@Autowired
私立学校知识库;
@应答器
@RequestMapping(“getschoolidandname.do”)
公共学校名单(){
List schools=schoolRepository.getSchoolIdAndName();
返回学校;
}

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

public interface SchoolRepository extends JpaRepository<School,Integer> {
    @Query("select s.id, s.name from School s")
    List<Object> getSchoolIdAndName();
}
公共接口学校存储库扩展了JpaRepository{
@查询(“从学校s中选择s.id、s.name”)
列出getSchoolIdAndName();
}
在控制器中:

@Autowired
private SchoolRepository schoolRepository;

@ResponseBody
@RequestMapping("getschoolidandname.do")
public List<Object> getSchool() {
    List<Object> schools = schoolRepository.getSchoolIdAndName();
    return schools;
}
@Autowired
私立学校知识库;
@应答器
@RequestMapping(“getschoolidandname.do”)
公共学校名单(){
List schools=schoolRepository.getSchoolIdAndName();
返回学校;
}

您可以使用Spring Data JPA的投影。在您的情况下,创建界面:

interface ProjectIdAndName{
    String getId();
    String getName();
}
并将以下方法添加到存储库中

List<ProjectIdAndName> findAll();
List findAll();

您可以使用Spring Data JPA的投影。在您的情况下,创建界面:

interface ProjectIdAndName{
    String getId();
    String getName();
}
并将以下方法添加到存储库中

List<ProjectIdAndName> findAll();
List findAll();

在我的例子中,我创建了一个单独的实体类,没有不需要的字段(只有需要的字段)

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

e、 g

您可以创建如下内容:

@Entity
@Table(name = "user")
Class UserLite{
         @Column(name = "id", unique=true, nullable=false)
         int id;
         @Column(name = "name", nullable=false)
         String name;
}
当您知道要获取的列时(这不会改变),这种方法就可以工作


如果您需要动态决定列,则无法工作。

在我的示例中,我创建了一个单独的实体类,其中没有不需要的字段(仅包含需要的字段)

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

e、 g

您可以创建如下内容:

@Entity
@Table(name = "user")
Class UserLite{
         @Column(name = "id", unique=true, nullable=false)
         int id;
         @Column(name = "name", nullable=false)
         String name;
}
当您知道要获取的列时(这不会改变),这种方法就可以工作


如果您需要动态决定列,则此选项不起作用。

使用Spring数据JPA,可以从数据库中选择特定列

----在DAOImpl----

@覆盖
@交易的
public List getAllEmployee()引发异常{
LOGGER.info(“内部getAllEmployee”);
列表empList=e
public interface ProjectRepository extends JpaRepository<Project, String> { 
    @Query(value = "SELECT projectId, projectName FROM project", nativeQuery = true)
    List<ProjectMini> findAllProjectsMini();
}
interface PersonRepository extends Repository<Person, UUID> {

    <T> Collection<T> findByLastname(String lastname, Class<T> type);
}
void someMethod(PersonRepository people) {

  Collection<Person> aggregates =
    people.findByLastname("Matthews", Person.class);

  Collection<NamesOnly> aggregates =
    people.findByLastname("Matthews", NamesOnly.class);
}
public static final String FIND_PROJECTS = "select ac_year_id,ac_year from tbl_au_academic_year where ac_year_id=?1";

    @Query(value = FIND_PROJECTS, nativeQuery = true)
    public  List<Object[]> findByAcYearId(Integer ac_year_id);