JPA2.0:批量查询,安全和性能?

JPA2.0:批量查询,安全和性能?,jpa,jpa-2.0,Jpa,Jpa 2.0,我正在寻找一个JPA解决方案(独立于供应商)来批量执行查询。挑战在于使其性能和线程安全 查询示例: Query query = em.createQuery("select e from Entity e where e.property in :list"); 该列表是一个大小介于1和385000之间的集合。因此,需要批处理此查询 最初的天真方法是从原始列表中获取一个子列表并循环直到完成。这是安全的,工作良好,除了它没有性能 第二种方法是将列表中的所有内容加载到临时表(永久存在,但用作临时表

我正在寻找一个JPA解决方案(独立于供应商)来批量执行查询。挑战在于使其性能和线程安全

查询示例:

Query query = em.createQuery("select e from Entity e where e.property in :list");
该列表是一个大小介于1和385000之间的集合。因此,需要批处理此查询

最初的天真方法是从原始列表中获取一个子列表并循环直到完成。这是安全的,工作良好,除了它没有性能

第二种方法是将列表中的所有内容加载到临时表(永久存在,但用作临时表),然后使用原始查询并与临时表联接。这当然是有性能的,但不是线程安全的,因为我需要在每次批处理之后清除temp表,并且temp表中没有任何线程id或类似的东西,这是非常不安全的(目前)

我非常感谢大家提出建议,以达成一个性能和安全的方式来解决这个问题


谢谢

首先,该查询不是有效的JPQL,因为它没有select子句

其次,它应该是(:list)中e.property所在的

我觉得你填充临时表的策略很好。您可以让它包含一个额外的uuid列,并在每次执行此类查询时生成一个新的uuid:

  • 生成UUID
  • 在表中插入列表的所有元素,将uuid列设置为生成的uuid
  • 执行一个查询,例如
    从实体e中选择e,TempEntity temp,其中e.property=temp.property和temp.uuid=:uuid
  • 执行查询以删除临时表中的所有行(并非绝对必要):
    delete from TempEntity temp where temp.uuid:uuid

独立于供应商意味着更改您的查询(添加“选择e”),因为这不是您提供的JPQL。发布实体类。谢谢大家。把查询搞错了一点,我们会修改它们以确保它看起来是正确的。谢谢。我刚刚想到了UUID,并得到了您的验证:)非常确定它应该是“in:list”,“in(:list)”是一个包含一个元素的列表,也就是说,“in(:arg1,:ag2)”是一个包含两个元素的列表,“in(:arg1)”=>“in(4)”如果arg是4。@James:您说得对。我习惯于Hibernate,直到最近,括号在Hibernate JPQL查询中还是必需的。看见