我创建了实体类:
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 中网格中的所有值但我只想 id
和login
。我怎样才能实现这个目标?我还尝试制作 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/