java - 使用 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;
    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();
}

并尝试在网格中显示来自@Query的值:

package purchasers;

import com.vaadin.annotations.Title;
import com.vaadin.server.VaadinRequest;
import com.vaadin.spring.annotation.SpringUI;
import com.vaadin.ui.*;
import order.Order;
import order.OrderRepository;
import org.springframework.beans.factory.annotation.Autowired;

@SpringUI(path = "/allpurchasers")
@Title("All today's purchasers")
public class AllPurchasersGUI extends UI {

    @Autowired
    private final OrderRepository orderRepository;
    final Grid<Order> grid;


    public AllPurchasersGUI(OrderRepository pr) {
        this.orderRepository = pr;
        grid = new Grid<>(Order.class);
        grid.setSizeFull();
    }

    @Override
    protected void init(VaadinRequest vaadinRequest) {
        setContent(grid);
        listPurchasers();
    }

    private void listPurchasers()
    {
        grid.setItems(orderRepository.findAllPurchasers());
    }
}

但我收到错误 org.springframework.dao.InvalidDataAccessResourceUsageException: could not execute query; SQL [SELECT id, login FROM bo_order]; nested exception is org.hibernate.exception.SQLGrammarException: could not execute query然后

Caused by: org.postgresql.util.PSQLException: The column name data_ins was not found in this ResultSet.

我知道data_ins不在 ResultSet 中,因为我不希望它在那里。我可以使用 findAll 显示 bo_order 中网格中的所有值但我只想 idlogin 。我怎样才能实现这个目标?我还尝试制作 List<Object>而不是List<Order>但后来我在显示时遇到了问题。

最佳答案

TL;DR:添加grid.setColumns("id", "login")listPurchasers()结束方法或包括data_ins@Query 的数据库列列表中注释。

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

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

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

或者,您也可以更改 @Query注释还包括 data_ins如果您确实希望该数据在网格中显示为列,则可以从数据库获取属性。

关于java - 使用 JPA 显示 Vaadin 网格中的一些列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49832228/

相关文章:

java - 如何在 IntelliJ 中使用我的 JPA 实体填充数据库

java - 使用 JMS session 读取消息来创建新消息

java - 如何在Spring Boot + Hibernate中实现 "delete"方法

java - 如何在 jpa 监听器中获取实体管理器或事务

java - 在实体对象中将 native SQL 与默认 Hibernate 行为混合?

spring-boot - 寻找 retryWhen 的替代方案,现在已弃用

java - 在 Clojure/Java 中通过自定义协议(protocol)建立 HTTP 隧道

java - MongoTemplate条件查询翻译似乎不正确

java - 列表与 Arrays.asList 构造的列表的区别有惊人的结果。为什么?

java - Spring 启动: how to show actual classpath on startup or at runtime?