Java 使用JPA在Vaadin网格中显示一些列

Java 使用JPA在Vaadin网格中显示一些列,java,spring-boot,jpa,vaadin,Java,Spring Boot,Jpa,Vaadin,我创建了实体类: package order; import javax.persistence.*; import java.time.LocalDate; import java.util.UUID; @Entity @Table(name = "bo_order") public class Order { @Id @GeneratedValue(strategy= GenerationType.IDENTITY) private Long id; pr

我创建了实体类:

package order;

import javax.persistence.*;
import java.time.LocalDate;
import java.util.UUID;

@Entity
@Table(name = "bo_order")
public class Order {
    @Id
    @GeneratedValue(strategy= GenerationType.IDENTITY)
    private Long id;
    private String login;
    private Long internalNumber;
    private String food;
    @Column(name="data_ins")
    private LocalDate dateOfOrder;
    private String orderNumber;

    public Order(){}

    public Order(String login)
    {
        this.login = login;
    }

    public Order(String login, Long internalNumber, String food, LocalDate dateOfOrder) {
        this.login = login;
        this.internalNumber = internalNumber;
        this.food = food;
        this.dateOfOrder = dateOfOrder;
    }

    public void setOrderNumber(String orderNumber) {
        this.orderNumber = orderNumber;
    }

    public String generateOrderNumber()
    {
        return UUID.randomUUID().toString();
    }

    @Override
    public String toString() {
        return "Order{" +
                "id=" + id +
                ", login='" + login + '\'' +
                ", internalNumber=" + internalNumber +
                ", food='" + food + '\'' +
                ", dateOfOrder=" + dateOfOrder +
                '}';
    }
}
已将存储库添加到此:

package order;

import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.CrudRepository;

import java.util.List;

public interface OrderRepository extends CrudRepository<Order, Long>{
    List<Order> findByLogin(String login);

    @Query(value="SELECT id, login FROM bo_order", nativeQuery = true)
    public List<Order> findAllPurchasers();
}

我知道
数据\u-ins
不在结果集中,因为我不希望它在那里。我可以用
findAll
按顺序显示网格中的所有值,但我只需要
id
login
。我怎样才能做到这一点?我还试图制作
列表
而不是
列表
,但后来我在显示时遇到了问题

网格从
Order
类中获取参数,所以如果有许多getter,那么它们将显示在列中。我做到了:

private void listPurchasers()
{
    List<Order> allOrders = (List<Order>) orderRepository.findAll();
    grid.setItems(allOrders);
    grid.setColumnOrder("id", "login", "dateOfOrder");
    grid.removeColumn("food");
}
private void listpowers()
{
List allOrders=(List)orderRepository.findAll();
网格设置项(allOrders);
setColumnOrder(“id”、“login”、“dateOfOrder”);
网格。移除柱(“食品”);
}

因此,添加/删除要显示的列似乎非常容易;DR:将
grid.setColumns(“id”、“login”)
添加到
listpowers()
方法的末尾,或在
@Query
注释中的数据库列列表中包含
数据

当您使用
Grid(Class beanType)
构造函数创建
Grid
时,将为bean类型中的每个getter添加一列。这将导致错误,除非所有这些getter的数据也从数据库加载

在这种情况下,
@Query
注释定义只应从数据库中获取
id
login
列的数据。您得到的异常涉及数据库列
data\u ins
,它似乎映射到
dateOfOrder
bean属性,但我没有看到任何代码会删除该属性自动添加的列

确保网格只使用所需列的最简单方法是使用
setColumns
方法。该方法的工作原理类似于
setColumnOrder
,只是它还删除了未作为参数包含的任何列


或者,如果您确实希望数据库中的
@Query
属性在网格中显示为一列,您还可以更改
@Query
注释,使其也包含该属性。

我认为主要问题是与spring数据相关的更多,因为他似乎期望他的repo仅从两列创建
订单的实例显示在结果集中::
选择id,从bo_订单登录
。所以他可能需要研究这样一个子集的投影。实际上grid.setColumns()做了一项工作——它只显示我想要的列,即使我按对象顺序设置了所有字段。
Caused by: org.postgresql.util.PSQLException: The column name data_ins was not found in this ResultSet.
private void listPurchasers()
{
    List<Order> allOrders = (List<Order>) orderRepository.findAll();
    grid.setItems(allOrders);
    grid.setColumnOrder("id", "login", "dateOfOrder");
    grid.removeColumn("food");
}