当前位置: 首页 > 知识库问答 >
问题:

Spring Data 1.7.0。RELEASE查询策略错误“基础架构显然不支持查询方法”

荣晨朗
2023-03-14

我在使用存储库的mysql的Spring Boot jpa Hibernate中收到以下错误:

创建名为“accountRepository”的bean:调用init方法失败;嵌套异常为java。lang.IllegalStateException:您在存储库中定义了查询方法,但没有定义任何查询查找策略。基础设施显然不支持查询方法!

这确实适用于只有Spring mvc应用程序而不是Spring Boot应用程序的旧版本Spring data jpa。

我能找到的唯一解决方案是有人降级到sping-data 1.6.2。我尝试了RELEASE(1.7.0的Spring Data JPA错误。M1查询查找策略异常),但它引起了其他冲突,可能是因为我使用了最近的Spring Boot,它有一个最近的Spring核心,很可能与旧版本的sping-data发生依赖冲突。

我还意识到,没有必要指定默认的queryLookupStrategy。

JPA配置通过Java配置是

@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(basePackages = "com.ranchtec.repository", queryLookupStrategy =       QueryLookupStrategy.Key.CREATE_IF_NOT_FOUND)
@PropertySource({ "classpath:db.properties" })
public class PersistenceJPAConfig {

@Value("${jdbc.driverClassName}")
private String driverClassName;
@Value("${jdbc.url}")
private String url;
@Value("${jpa.generateDdl}")
boolean jpaGenerateDdl;

// Hibernate specific
@Value("${hibernate.dialect}")
String hibernateDialect;
@Value("${hibernate.show_sql}")
boolean hibernateShowSql;
@Value("${hibernate.hbm2ddl.auto}")
String hibernateHbm2ddlAuto;

@Value("${jdbc.username}")
private String jdbcUsername;
@Value("${jdbc.password}")
private String jdbcPassword;

public PersistenceJPAConfig() {
}

@Autowired
org.springframework.core.env.Environment env;

// beans

@Bean
public LocalContainerEntityManagerFactoryBean entityManagerFactory() {
    final LocalContainerEntityManagerFactoryBean factoryBean = new LocalContainerEntityManagerFactoryBean();
    factoryBean.setDataSource(appDataSource());
    factoryBean.setPackagesToScan(new String[] { "com.ranchtec.domain" });

    final JpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter() {
        {
            setDatabasePlatform(hibernateDialect);
            setShowSql(hibernateShowSql);
            setGenerateDdl(jpaGenerateDdl);
            setDatabase(Database.MYSQL);
        }
    };
    factoryBean.setJpaVendorAdapter(vendorAdapter);
    factoryBean.setJpaProperties(additionlProperties());
    return factoryBean;
}

@Bean
public DataSource appDataSource() {
    final DriverManagerDataSource dataSource = new DriverManagerDataSource();
    dataSource.setDriverClassName(driverClassName);
    dataSource.setUrl(url);
    dataSource.setUsername(jdbcUsername);
    dataSource.setPassword(jdbcPassword);
    return dataSource;
}

@Bean
public PlatformTransactionManager transactionManager() {
    final JpaTransactionManager transactionManager = new JpaTransactionManager();
    transactionManager.setEntityManagerFactory(entityManagerFactory().getObject());
    return transactionManager;
}

@Bean
public PersistenceExceptionTranslationPostProcessor persistenceExceptionTranslationPostProcessor() {
    return new PersistenceExceptionTranslationPostProcessor();
}

final Properties additionlProperties() {
    return new Properties() {
        {
            // use this to inject additional properties in the EntityManager
           // setProperty("hibernate.hbm2ddl.auto", hibernateHbm2ddlAuto);
            setProperty("hibernate.ejb.naming_strategy", org.hibernate.cfg.ImprovedNamingStrategy.class.getName());
        }
    };
}

存储库是通用的:

public interface AccountRepository extends CrudRepository<Account, Long> {

Account findById(Long id);
Account findByUserName(String userName);
List<Account> findAll();
}

主要部门:

 <dependency>
        <groupId>org.springframework.data</groupId>
        <artifactId>spring-data-jpa</artifactId>
        <version>1.7.0.RELEASE</version>
    </dependency>
    <!-- for JPA, use hibernate-entitymanager instead of hibernate-core -->
    <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-entitymanager</artifactId>
        <version>4.3.6.Final</version>
    </dependency>    

共有1个答案

谭刚毅
2023-03-14

您需要包括spring data commons更高版本,例如1.9.1。发布

 类似资料:
  • 以下策略可用于仓库基础结构来解决查询。你可以在XML配置中的命名空间通过query-lookup-strategy属性来配置策略或者在JAVA配置中通过Enable${store}Repositories声明queryLookupStrategy属性。有些策略可能对于特别的datastores并不支持。 CREATE 从查询方法名来尝试构建一个特别的数据查询。一般的方法都是从方法名称中移除已知设定

  • 这里是我的问题:我从amazon dynamodb api中读到,for query中的条件意味着检查列表*中的匹配元素,但为什么它返回错误:*查询键条件不受支持? aws dynamodb查询--表名Music--关键条件{“艺术家”:{“AttributeValueList”:[{“S”:“Wangdong”}、{“S”:“Acme Band”}]、“ComparisonOperator”:“

  • 我正在尝试查询我的dynamodb表以获取提要\u guid和状态\u id=1。但它返回查询键条件不受支持的错误。请查找我的表架构和查询。 以下是我更新该表的查询。

  • Elasticsearch模块支持所有基本查询构建,比如String,Abstract,Criteria或通过方法名获得构建查询。 声明查询 通过解析方法名来构建查询有时可能满足不了开发者的需求,或造成方法名可读性差。这时可以使用@Query注解来声明一个查询(参考使用@Query注解)

  • Spring Data repository使用下面的一套策略来决定最后创建的查询。可以通过配置XML中的query-loop-strategy属性或Javaconfig中Enable${store}Repositories注解的queryLookupStrategy属性来调整策略。某些特定的数据存储可能不支持所有策略。 CREATE 通过解析方法名构建查询,会删除方法名的某些前缀(eg:find

  • 我正在从aws Dynamodb中的数据库中查询数据,并在Key条件表达式上遇到错误消息。 我在查询“支配性时间性”和“dt”。这些组成了我的复合分区键-dt对于每一行和我的排序键都是唯一的。 我正在运行的代码: