从表中仅选择一些列

时间:2018-11-15 16:52:26

标签: java oracle spring-boot jpa spring-data-jpa

是否可以使用jpa从表中仅选择某些列?

我的表很大,并且不允许映射我实体中的所有列。我试图创建一个实体(注意,我的表中没有PK):

@Entity
@Table(name = "SuperCat")
@Getter
@Setter
public class Cat{

@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE)
private Long id;

@Column(name="nameCat")
private String name;
}

然后在我的存储库中

public interface CatRepository extends 
CrudRepository<Cat, Long> {

@Query(
  "SELECT name FROM Cat")
Page<Cat> getAlCats(Pageable pageable);

这只是一个简单的示例,但是想法是相同的。我进行了很多搜索,找到了投影,但是您需要映射整个表,然后找到了本机查询,但仍然不适用。我知道我可以返回一个对象,另一个解决方案是对NEW使用查询并创建我自己的对象(没有@entity,如pojo)。但是有没有一种方法可以使用jpa做到这一点,以便能够使用存储库和服务,如果我创建自己的pojo,那么我将创建一个@transactional类,将查询(带有NEW)放在那里,就是这样。我不喜欢这种方法,我不认为jpa不允许您仅选择一些列,但是我没有找到合适的方法。 也许您会问,如果我这样做是什么结果: 我收到此错误:“无法使用请求的结果类型[java.lang.Long]为具有多个返回的查询创建TypedQuery” (对于新查询,我正在谈论:http://www.java2s.com/Tutorials/Java/JPA/4800__JPA_Query_new_Object.htm也许我不清楚)

2 个答案:

答案 0 :(得分:0)

您可以使用以下方法进行同样的操作。

只需在实体类中使用所有必需的参数创建一个构造函数,然后在jpa查询中使用 new运算符进行查询,如下所示。

String query = "SELECT NEW com.dt.es.CustomObject(p.uniquePID)  FROM PatientRegistration AS p";
        TypedQuery<CustomObject> typedQuery = entityManager().createQuery(query , CustomObject.class);
        List<CustomObject> results = typedQuery.getResultList();
        return results;

CustomObject类应与构造函数类似,如下所示。

public class CustomObject {

    private String uniquePID;

    public CustomObject(String uniquePID) {
        super();
        this.uniquePID = uniquePID;
    }

    public String getUniquePID() {
        return uniquePID;
    }

    public void setUniquePID(String uniquePID) {
        this.uniquePID = uniquePID;
    }


}

答案 1 :(得分:0)

spring-data-jpa projection不需要映射整个表,只需选择必要的文件即可:

mysvc.exe
  

通过这种方式,CatDto是一个接口,它仅包含整个表的某些字段。其字段名称必须与选择字段的别名匹配。