仅从表中选择一些列

问题描述 投票:1回答:2

有没有办法使用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);

这只是一个简单的例子,但想法是一样的。我搜索了很多,我找到了投影,但是你需要映射整个表格,然后我找到了原生查询,但仍然不适用。我知道我可以返回一个Object,另一个解决方案是使用带有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也许我不清楚)

java oracle spring-boot jpa spring-data-jpa
2个回答
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;
    }


}

0
投票

qazxsw poi不需要映射整个表,只需选择必要的字段:

spring-data-jpa projection

通过这种方式,Catto是一个接口,它只包括整个表的一些字段。其字段名称需要与选择字段的别名相匹配。

© www.soinside.com 2019 - 2024. All rights reserved.