仅从表中选择一些列

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了仅从表中选择一些列相关的知识,希望对你有一定的参考价值。

有没有办法使用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也许我不清楚)

答案

您可以使用以下方法执行相同操作。

只需在实体类中创建一个包含所有必需参数的构造函数,然后在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;
    }


}
另一答案

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

spring-data-jpa projection

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

以上是关于仅从表中选择一些列的主要内容,如果未能解决你的问题,请参考以下文章

仅从表中选择最新记录并使其快速,如何?

SQL - 仅从表中获取并非所有值都是空值的列

休眠:仅从一个表中选择所有而不是 3 个连接表

仅从表中的多个字段返回异常

SQLAlchemy 仅从连接表中选择列

Swift:仅从表中的某些行/部分中分离