我对hibernate和spring-data-jpa还很陌生。我想做的就是使用分页(大约有4000万条记录)来获取一个实体和它的所有相关实体。也就是说,一个查询来急切地获取根实体和它们的所有映射实体/集合=1个查询
<java-version>1.7</java-version>
<spring.framework.version>4.0.2.RELEASE</spring.framework.version>
<hibernate-core>4.3.4.Final</hibernate-core>
<hibernate-validator>5.1.0.Final</hibernate-validator>
<hibernate-entitymanager>4.3.4.Final</hibernate-entitymanager>
<spring-data-jpa>1.5.1.RELEASE</spring-data-jpa>
我有2个实体类(Customer和Order)如下:
客户实体
@Entity
@Table(name = "view_customerOrders_to_process")
public class Customer implements Serializable {
private Long id;
private List<Order> Orders;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "customer_id", updatable = false)
public Long getId() {
return id;
}
........
@NotFound(action = NotFoundAction.IGNORE)
@OneToMany(fetch = FetchType.EAGER, mappedBy = "customer")
//Do not cascade any changes to child entities.
@Where(clause = "order_status = 'PENDING'")
public List<Order> getOrders() {
return order;
}
}
尝试使用batchSize,但由于某种原因它无法工作(同样的N+1问题)。
//@Fetch(FetchMode.Select)
//@batchSize(size=25)
@Table(name = "tbl_orders")
public class Order implements Serializable {
private Long id;
private int customerId;
private Customer customer;
private OrderType orderType;
..........
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "order_id", updatable = false)
public Long getId() {
return this.id;
}
@OneToOne
@NotFound(action = NotFoundAction.IGNORE)
@JoinColumn(name = "order_type", nullable = true, unique = false, updatable = false)
public OrderType getOrderType() {
return this.orderType;
}
@NotFound(action = NotFoundAction.IGNORE)
@ManyToOne(fetch = FetchType.LAZY, optional = true, targetEntity = Customer.class)
@Fetch(FetchMode.JOIN)
@JoinColumns({
@JoinColumn(updatable = false, insertable = false,
name="customer_id", referencedColumnName = "customer_id", nullable=false),
. . . . .
})
public Customer getCustomer() {
return customer;
}
}
@Service
public class MetsGeneratorService {
. . .
@Autowired
private CustomerRepository customerRepository;
public List<Customer> run() {
PageRequest pageRequest = new PageRequest(0, batchSize);
List<Customer> customers = customerRepository.findOrdersUnprocessed(pageRequest);
return customers;
}
. . .
}
public interface CustomerRepository extends JpaRepository<Customer, Long> {
@Query("SELECT e FROM Customer e")
List<Customer> findOrdersUnprocessed(Pageable pageable);
//Tried using the below one which seems to eliminate paging
//and understandably getting out of memory.
//@Query(value = "SELECT e FROM Customer e left join fetch e.orders")
}
@Query(value = "SELECT e FROM Customer e left join fetch e.orders",
countQuery = "select count(e) from Customer e")
List<Customer> findOrdersUnprocessed(Pageable pageable);
如果您看到它正在处理的日志,请执行“select*”而不是分页。
日志消息为WARN org.hibernate.hql.internal.ast.QueryTranslatorImpl-hhh000104:用集合提取指定FirstResult/MaxResults;在内存中应用!
您可以使用
@Fetch(FetchMode.SUBSELECT)
若要删除(N+1)个查询问题,请执行以下操作。
问题内容: 我正在尝试使用HQL使用JOIN FETCH来获取我的实体以及子实体,如果我想要所有结果,这可以正常工作,但是如果我想要一个Page,则不是这样 我的实体是 并且由于我有数百万次的访问,因此我需要使用Pageable,并且希望在单个数据库查询中提取注释: 该HQL调用引发以下异常: 一旦我删除分页,一切正常 显然问题是来自Spring-Data的count查询,但是我们如何解决呢? 问
我将hibernate-orm与spring-data-jpa一起使用。我有三个实体、、声明如下: 我的目标是获得A和获取b的列表,在实体C上有一些条件,而不获取它。以下JPQL工作正常。 当我尝试使用JPA规范时,我的规范如下所示: 我正在重用由fetch操作完成的隐式连接。此连接不符合规范。它输出以下JPQL。 也就是说,没有别名。 我研究了Hibernate GitHub的源代码。我发现,有
我正在尝试使用HQL来获取我的实体以及使用JOIN FETCH的子实体,如果我想要所有的结果,这很好工作,但如果我想要一个页面,情况就不是这样了 我的实体是 因为我有数百万次的访问,所以我需要使用Pageable,并且我希望在单个数据库查询中获取注释,比如: 该HQL调用引发以下异常:
我将spring datat jpa谓词与Join Fetch一起使用,我的响应非常慢。我收到一条警告消息: [警告]组织。冬眠hql。内部的ast。QueryTranslatorImpl:hh000104:使用集合获取指定的firstResult/maxResults;正在内存中应用!
前一段时间,我的查询对于单行更新很有效。现在我必须修改这个查询来更新多行。查询是本机的,使用postgresql和postgis。 老问题是: 在新的查询中,我在中添加了一些参数,如下所述: 但可悲的是,这种改变没有任何效果。(如果我午餐从postgresql查询它运行完美)。我该怎么解决? 编辑:我添加了查询,但它适用于postgresql。唯一的区别是旧版本:目标是一行,新的以多行为目标。id
我使用的是spring-data-jpa。我写了一个本机查询,但它不起作用。这是我的实体类: 以下是查询: 起初,当我没有编写nativeQuery=true时,应用程序没有构建,我得到了一个异常“加入jpa的预期路径”。当我设置nativeQuery=true时,应用程序已启动,但当我调用该函数时,我收到以下错误: 是否有任何其他设置或注释可以解决此问题?我在谷歌上搜索过,但在所有情况下都有两个