Java 插入带有jpa错误的select

Java 插入带有jpa错误的select,java,oracle,hibernate,jpa,weblogic,Java,Oracle,Hibernate,Jpa,Weblogic,我正在尝试用Jpa插入select。 我尝试在其上执行此操作的实体如下所示: @Entity public class A { private String fieldOne; private String fieldTwo; private String fieldThree; private B fieldFour; @Id public String getFieldOne(){...} @Id public

我正在尝试用Jpa插入select。 我尝试在其上执行此操作的实体如下所示:

@Entity
public class A {
     private String fieldOne;
     private String fieldTwo;
     private String fieldThree;
     private B fieldFour;

     @Id
     public String getFieldOne(){...}
     @Id
     public String getFieldTwo(){...}
     @Id
     @OneToOne
     public B getFieldThree(){...}

     public String getFieldFour(){...}
     ....


@Entity
public class B {
    private CompositeId id;
    ....

    @EmbeddedId
    public CompositeId getId(){
        return MyUUIDGenerator.generateCompositeId();
    }
    ....
我尝试插入的内容非常简单:

insert into A (fieldOne, fieldTwo, fieldThree, fieldFour) 
    select 'staticValueOne', 'staticValueTwo', B.id, 'staticValueFour' from B
    where ....
“staticValueX”是应用程序计算的值,对于给定的一组B元素,我需要这些值都相等

在执行过程中,应用程序返回异常:

java.lang.IllegalArgumentException:org.hibernate.QueryException:can 仅将ID作为大容量插入的一部分使用序列或 插入后样式生成器[插入到

我不明白为什么,因为我在A中没有任何生成的值,我给了insert它需要的所有值。 有没有人建议理解这种行为

谢谢

编辑:一点更新

我仅使用标记为@Id的字符串类型字段更改了类A,但hibernate在正确构建查询时出错:表别名与字段名称的关联缺少一些字段。

来自JPA 2.0规范,第4.2章语句类型:

Java持久性查询语言语句可以是select语句或 语句、update语句或delete语句

在BNF语法中,查询语言语句定义为:

QL_语句::=选择_语句|更新_语句|删除_语句

在JPQL或Criteria API中使用ElementManager.persist代替JPA中不支持的SELECT语句,该语句在事务中的实体上使用。当事务提交时,实体将写入数据库SQL INSERT将由作为持久性提供程序的Hibernate隐式执行


编辑:如果有大量插入,您可以仔细查看Hibernate的批插入。另一种选择是放弃JPA,直接使用JDBC的批插入PreparedStatement。

JPA不支持JPA中的insert语句,只支持select、update和delete。要持久化数据,您需要使用entitymanager和object style、 您是否将插入作为本机查询执行?因为在我看来,您正在以一种不需要的方式混合JPA和SQL,这使得事情变得复杂。此外,您应该只将@Id应用于我使用的是Jpql,而不是本机查询。由于性能问题,我被迫使用这种类型的插入。我还尝试通过测试删除所有Id,在insert中添加了一个具有EmbeddedId的字段,该字段使用了与B.id相同的值,insert工作得非常好。但我不能使用此解决方法。JPQL中没有insert…尝试使用SQL,在这种情况下,删除JPA或JPQL,正如您所注意到的,混合它们可能非常困难。如果您有性能问题,请查看Hibernate查询日志并在数据库服务器上对慢速查询运行分析,以了解查询为何如此缓慢,9/10它只是一个缺少的索引。不幸的是,我无法使用持久化,因为它太慢了:存储2000条记录大约需要4秒,而此生产查询将处理大量2/3百万条记录。因此,我需要找到一个解决方法而我发现的唯一想法就是使用insert-into-select。我在Hibernate中也找到了这个文档:如果我没有错的话,它似乎支持insert-into-select,即使它实际上不起作用