Spring Boot JPA (HSQLDB):使用 data.sql 中的 SELECT 插入,意外标记:SELECT

问题描述 投票:0回答:1

我有这门课:

@AllArgsConstructor
@NoArgsConstructor
@Entity
@Table(name = "SECURITY_AUTHORITIES")
public class SecurityAuthority implements GrantedAuthority {

    @Serial
    private static final long serialVersionUID = 1425681467463792708L;

    @Id
    @GeneratedValue(strategy = GenerationType.UUID)
    @Column(name = "id", columnDefinition = "uuid", updatable = false)
    private UUID id;

    @Column(nullable = false, unique = true, length = 10)
    private String authority;

    @ManyToMany(fetch = FetchType.LAZY, cascade = { CascadeType.PERSIST, CascadeType.MERGE, CascadeType.DETACH, CascadeType.REFRESH })
    @JoinTable(name = "ROLE_AUTHORITY_MAPPING", joinColumns = @JoinColumn(name = "authority_id"),
            inverseJoinColumns = @JoinColumn(name = "role_id"))
    private Set<SecurityRole> securityRoles;
    
    // Setters && Getters
    
}

这堂课:

@AllArgsConstructor
@NoArgsConstructor
@Entity
@Table(name = "SECURITY_ROLES")
public class SecurityRole implements Serializable {
    @Serial
    private static final long serialVersionUID = 4381713981219682243L;

    @Id
    @GeneratedValue(strategy = GenerationType.UUID)
    @Column(name = "id", columnDefinition = "uuid", updatable = false)
    private UUID id;

    @Column(nullable = false, unique = true, length = 10)
    private String name;

    @ManyToMany(fetch = FetchType.LAZY, cascade = { CascadeType.PERSIST, CascadeType.MERGE, CascadeType.DETACH, CascadeType.REFRESH })
    @JoinTable(name = "ROLE_AUTHORITY_MAPPING", joinColumns = @JoinColumn(name = "role_id"),
            inverseJoinColumns = @JoinColumn(name = "authority_id"))
    private Set<SecurityAuthority> securityAuthorities;
    
    // Setters && Getters
    
}

我制作了这个

import.sql
文件:

-- BEGIN: This UUID part Work!
CREATE TRIGGER TRIG_ROLES BEFORE INSERT ON SECURITY_ROLES REFERENCING NEW ROW AS NEW_ROLE FOR EACH ROW SET NEW_ROLE.ID = UUID();
CREATE TRIGGER TRIG_AUTHORITIES BEFORE INSERT ON SECURITY_AUTHORITIES REFERENCING NEW ROW AS NEW_AUTHORITY FOR EACH ROW SET NEW_AUTHORITY.ID = UUID();
-- END: This UUID part Work!

INSERT INTO SECURITY_ROLES (name) VALUES('ADMIN');
INSERT INTO SECURITY_ROLES (name) VALUES('USER');
INSERT INTO SECURITY_ROLES (name) VALUES('GUEST');

INSERT INTO SECURITY_AUTHORITIES (authority) VALUES('READ_ALL');
INSERT INTO SECURITY_AUTHORITIES (authority) VALUES('READ_SELF');
INSERT INTO SECURITY_AUTHORITIES (authority) VALUES('CREATE');

SELECT id FROM SECURITY_AUTHORITIES WHERE authority = 'READ_ALL';
SELECT id FROM SECURITY_ROLES WHERE name = 'ADMIN';


INSERT INTO ROLE_AUTHORITY_MAPPING (authority_id, role_id) VALUES ( SELECT id FROM SECURITY_AUTHORITIES WHERE authority = 'READ_SELF', SELECT id FROM SECURITY_ROLES WHERE name = 'USER');

但我收到此错误:

Hibernate: INSERT INTO ROLE_AUTHORITY_MAPPING (authority_id, role_id) VALUES ( SELECT id FROM SECURITY_AUTHORITIES WHERE authority = 'READ_SELF', SELECT id FROM SECURITY_ROLES WHERE name = 'USER')
2024-03-30T01:22:16.929-05:00  WARN 4732 --- [ms-people] [           main] o.h.t.s.i.ExceptionHandlerLoggedImpl     : GenerationTarget encountered exception accepting command : Error executing DDL "INSERT INTO ROLE_AUTHORITY_MAPPING (authority_id, role_id) VALUES ( SELECT id FROM SECURITY_AUTHORITIES WHERE authority = 'READ_SELF', SELECT id FROM SECURITY_ROLES WHERE name = 'USER')" via JDBC [unexpected token: SELECT]

org.hibernate.tool.schema.spi.CommandAcceptanceException: Error executing DDL "INSERT INTO ROLE_AUTHORITY_MAPPING (authority_id, role_id) VALUES ( SELECT id FROM SECURITY_AUTHORITIES WHERE authority = 'READ_SELF', SELECT id FROM SECURITY_ROLES WHERE name = 'USER')" via JDBC [unexpected token: SELECT]
    at org.hibernate.tool.schema.internal.exec.GenerationTargetToDatabase.accept(GenerationTargetToDatabase.java:94) ~[hibernate-core-6.4.4.Final.jar:6.4.4.Final]
    at org.hibernate.tool.schema.internal.Helper.applySqlString(Helper.java:233) ~[hibernate-core-6.4.4.Final.jar:6.4.4.Final]
    at org.hibernate.tool.schema.internal.Helper.applyScript(Helper.java:255) ~[hibernate-core-6.4.4.Final.jar:6.4.4.Final]
    at org.hibernate.tool.schema.internal.SchemaCreatorImpl.applyImportFiles(SchemaCreatorImpl.java:665) ~[hibernate-core-6.4.4.Final.jar:6.4.4.Final]
    at org.hibernate.tool.schema.internal.SchemaCreatorImpl.applyImportSources(SchemaCreatorImpl.java:584) ~[hibernate-core-6.4.4.Final.jar:6.4.4.Final]
    at org.hibernate.tool.schema.internal.SchemaCreatorImpl.performCreation(SchemaCreatorImpl.java:184) ~[hibernate-core-6.4.4.Final.jar:6.4.4.Final]
    at org.hibernate.tool.schema.internal.SchemaCreatorImpl.doCreation(SchemaCreatorImpl.java:142) ~[hibernate-core-6.4.4.Final.jar:6.4.4.Final]
    at org.hibernate.tool.schema.internal.SchemaCreatorImpl.doCreation(SchemaCreatorImpl.java:118) ~[hibernate-core-6.4.4.Final.jar:6.4.4.Final]
    at org.hibernate.tool.schema.spi.SchemaManagementToolCoordinator.performDatabaseAction(SchemaManagementToolCoordinator.java:256) ~[hibernate-core-6.4.4.Final.jar:6.4.4.Final]
    at org.hibernate.tool.schema.spi.SchemaManagementToolCoordinator.lambda$process$5(SchemaManagementToolCoordinator.java:145) ~[hibernate-core-6.4.4.Final.jar:6.4.4.Final]
    at java.base/java.util.HashMap.forEach(HashMap.java:1421) ~[na:na]
    at org.hibernate.tool.schema.spi.SchemaManagementToolCoordinator.process(SchemaManagementToolCoordinator.java:142) ~[hibernate-core-6.4.4.Final.jar:6.4.4.Final]
    at org.hibernate.boot.internal.SessionFactoryObserverForSchemaExport.sessionFactoryCreated(SessionFactoryObserverForSchemaExport.java:37) ~[hibernate-core-6.4.4.Final.jar:6.4.4.Final]
    at org.hibernate.internal.SessionFactoryObserverChain.sessionFactoryCreated(SessionFactoryObserverChain.java:35) ~[hibernate-core-6.4.4.Final.jar:6.4.4.Final]
    at org.hibernate.internal.SessionFactoryImpl.<init>(SessionFactoryImpl.java:315) ~[hibernate-core-6.4.4.Final.jar:6.4.4.Final]
    at org.hibernate.boot.internal.SessionFactoryBuilderImpl.build(SessionFactoryBuilderImpl.java:450) ~[hibernate-core-6.4.4.Final.jar:6.4.4.Final]
    at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:1507) ~[hibernate-core-6.4.4.Final.jar:6.4.4.Final]
    at org.springframework.orm.jpa.vendor.SpringHibernateJpaPersistenceProvider.createContainerEntityManagerFactory(SpringHibernateJpaPersistenceProvider.java:75) ~[spring-orm-6.1.5.jar:6.1.5]
    at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.createNativeEntityManagerFactory(LocalContainerEntityManagerFactoryBean.java:390) ~[spring-orm-6.1.5.jar:6.1.5]
    at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.buildNativeEntityManagerFactory(AbstractEntityManagerFactoryBean.java:409) ~[spring-orm-6.1.5.jar:6.1.5]
    at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.afterPropertiesSet(AbstractEntityManagerFactoryBean.java:396) ~[spring-orm-6.1.5.jar:6.1.5]
    at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.afterPropertiesSet(LocalContainerEntityManagerFactoryBean.java:366) ~[spring-orm-6.1.5.jar:6.1.5]
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1833) ~[spring-beans-6.1.5.jar:6.1.5]
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1782) ~[spring-beans-6.1.5.jar:6.1.5]
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:600) ~[spring-beans-6.1.5.jar:6.1.5]
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:522) ~[spring-beans-6.1.5.jar:6.1.5]
    at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:326) ~[spring-beans-6.1.5.jar:6.1.5]
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234) ~[spring-beans-6.1.5.jar:6.1.5]
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:324) ~[spring-beans-6.1.5.jar:6.1.5]
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:200) ~[spring-beans-6.1.5.jar:6.1.5]
    at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:1234) ~[spring-context-6.1.5.jar:6.1.5]
    at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:952) ~[spring-context-6.1.5.jar:6.1.5]
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:624) ~[spring-context-6.1.5.jar:6.1.5]
    at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:146) ~[spring-boot-3.2.4.jar:3.2.4]
    at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:754) ~[spring-boot-3.2.4.jar:3.2.4]
    at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:456) ~[spring-boot-3.2.4.jar:3.2.4]
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:334) ~[spring-boot-3.2.4.jar:3.2.4]
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:1354) ~[spring-boot-3.2.4.jar:3.2.4]
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:1343) ~[spring-boot-3.2.4.jar:3.2.4]
    at org.bz.app.mspeople.MsPeopleApplication.main(MsPeopleApplication.java:10) ~[classes/:na]
Caused by: java.sql.SQLSyntaxErrorException: unexpected token: SELECT
    at org.hsqldb.jdbc.JDBCUtil.sqlException(Unknown Source) ~[hsqldb-2.7.2.jar:2.7.2]
    at org.hsqldb.jdbc.JDBCUtil.sqlException(Unknown Source) ~[hsqldb-2.7.2.jar:2.7.2]
    at org.hsqldb.jdbc.JDBCStatement.fetchResult(Unknown Source) ~[hsqldb-2.7.2.jar:2.7.2]
    at org.hsqldb.jdbc.JDBCStatement.execute(Unknown Source) ~[hsqldb-2.7.2.jar:2.7.2]
    at org.hibernate.tool.schema.internal.exec.GenerationTargetToDatabase.accept(GenerationTargetToDatabase.java:80) ~[hibernate-core-6.4.4.Final.jar:6.4.4.Final]
    ... 39 common frames omitted
Caused by: org.hsqldb.HsqlException: unexpected token: SELECT
    at org.hsqldb.error.Error.parseError(Unknown Source) ~[hsqldb-2.7.2.jar:2.7.2]
    at org.hsqldb.ParserBase.unexpectedToken(Unknown Source) ~[hsqldb-2.7.2.jar:2.7.2]
    at org.hsqldb.ParserDQL.XreadSimpleValueExpressionPrimary(Unknown Source) ~[hsqldb-2.7.2.jar:2.7.2]
    at org.hsqldb.ParserDQL.XreadAllTypesValueExpressionPrimary(Unknown Source) ~[hsqldb-2.7.2.jar:2.7.2]
    at org.hsqldb.ParserDQL.XreadAllTypesPrimary(Unknown Source) ~[hsqldb-2.7.2.jar:2.7.2]
    at org.hsqldb.ParserDQL.XreadAllTypesFactor(Unknown Source) ~[hsqldb-2.7.2.jar:2.7.2]
    at org.hsqldb.ParserDQL.XreadAllTypesTerm(Unknown Source) ~[hsqldb-2.7.2.jar:2.7.2]
    at org.hsqldb.ParserDQL.XreadAllTypesCommonValueExpression(Unknown Source) ~[hsqldb-2.7.2.jar:2.7.2]
    at org.hsqldb.ParserDQL.XreadValueExpression(Unknown Source) ~[hsqldb-2.7.2.jar:2.7.2]
    at org.hsqldb.ParserDQL.XreadRowElementList(Unknown Source) ~[hsqldb-2.7.2.jar:2.7.2]
    at org.hsqldb.ParserDQL.XreadAllTypesValueExpressionPrimary(Unknown Source) ~[hsqldb-2.7.2.jar:2.7.2]
    at org.hsqldb.ParserDQL.XreadAllTypesPrimary(Unknown Source) ~[hsqldb-2.7.2.jar:2.7.2]
    at org.hsqldb.ParserDQL.XreadAllTypesFactor(Unknown Source) ~[hsqldb-2.7.2.jar:2.7.2]
    at org.hsqldb.ParserDQL.XreadAllTypesTerm(Unknown Source) ~[hsqldb-2.7.2.jar:2.7.2]
    at org.hsqldb.ParserDQL.XreadAllTypesCommonValueExpression(Unknown Source) ~[hsqldb-2.7.2.jar:2.7.2]
    at org.hsqldb.ParserDQL.XreadValueExpression(Unknown Source) ~[hsqldb-2.7.2.jar:2.7.2]
    at org.hsqldb.ParserDQL.XreadValueExpressionWithContext(Unknown Source) ~[hsqldb-2.7.2.jar:2.7.2]
    at org.hsqldb.ParserDQL.readRow(Unknown Source) ~[hsqldb-2.7.2.jar:2.7.2]
    at org.hsqldb.ParserDQL.XreadContextuallyTypedTable(Unknown Source) ~[hsqldb-2.7.2.jar:2.7.2]
    at org.hsqldb.ParserDML.compileInsertStatement(Unknown Source) ~[hsqldb-2.7.2.jar:2.7.2]
    at org.hsqldb.ParserCommand.compilePart(Unknown Source) ~[hsqldb-2.7.2.jar:2.7.2]
    at org.hsqldb.ParserCommand.compileStatements(Unknown Source) ~[hsqldb-2.7.2.jar:2.7.2]
    at org.hsqldb.Session.executeDirectStatement(Unknown Source) ~[hsqldb-2.7.2.jar:2.7.2]
    at org.hsqldb.Session.execute(Unknown Source) ~[hsqldb-2.7.2.jar:2.7.2]
    ... 42 common frames omitted

直接在 HSQLDB 控制台中执行 SELECT 查询即可:

但是,当我在

SELECT
中使用
INSERT
时,我在同一个句子中遇到了相同的错误:

INSERT INTO ROLE_AUTHORITY_MAPPING (authority_id, role_id) 
    VALUES (
        SELECT id FROM SECURITY_AUTHORITIES WHERE authority = 'READ_SELF',
        SELECT id FROM SECURITY_ROLES WHERE name = 'USER'
    );

这听起来像是一个错误,但我以这种方式执行 INSERT 是错误的。 执行插入的一些线索?

spring-data-jpa sql-insert hsqldb import.sql
1个回答
0
投票

您需要一个 SELECT 连接两个表:

INSERT INTO ROLE_AUTHORITY_MAPPING (authority_id, role_id)
  (SELECT security_authorities.id, security_roles.id FROM SECURITY_AUTHORITIES 
    cross join SECURITY_ROLES WHERE authority = 'READ_SELF' and name = 'USER');
© www.soinside.com 2019 - 2024. All rights reserved.