【发布时间】:2020-11-09 20:45:11
【问题描述】:
我有这些实体 - 物品
@Entity
@Table(name="Item")
public class Item
{
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name="id")
private Long id;
@ManyToOne(fetch=FetchType.LAZY)
@JoinColumn(name="item_set_id")
private ItemSet itemSet;
@ManyToOne(fetch=FetchType.LAZY)
@JoinColumn(name="category_id")
private Category category;
@Column(name="category_name")
private String categoryName;
// 5 other fields which aren't required for the query
}
和Category -
@Entity
@Table(name="Category")
public class Category
{
@Id
@Column(name="id")
private Long id;
@ManyToOne(fetch=FetchType.LAZY)
@JoinColumn(name="parent_id")
private Category parent_id;
@Column(name="name")
private String name;
}
我需要运行这个 sql 查询:
select id, category_id, category_name from Item where item_set_id = ?
我在ItemRepository 中使用这个[1],但性能并不好。它正在检索Item 和Category 中的所有字段(包括我不需要的与Category 的连接)。
[1]
@Query("SELECT i FROM Item i WHERE item_set_id = ?1")
List<Item> findByItemSet(Long itemSetId);
我正在尝试使用命名查询和投影来提高性能,但我似乎无处可去。我不断遇到 - Validation failed for query for method public abstract java.util.List findByItemSet(Long)。我已经尝试创建一个 DTO 类和一个接口来做同样的事情,但它仍然不起作用。
@Query("SELECT a.id, "
+ "a.category_name, a.category_id FROM Item a WHERE a.item_set_id = :itemSetId")
List<Item> findByItemSet(Long itemSetId);
关于如何解决此问题的任何想法/建议?
编辑:我使用的是 springboot 2.0.4-RELEASE、java 8 和 MS-SQL Server 2012。
【问题讨论】:
-
我认为,当您将最后一个变体标记为本机查询时,它应该可以工作。如果没有,请发布异常的完整堆栈跟踪。
-
@JensSchauder 将其标记为本机查询后,我遇到了 - SQL 错误:0,SQLState:S1093 列名 item_set_id 无效。
标签: spring hibernate jpa spring-data-jpa spring-data