GVKun编程网logo

java – Spring数据存储库的字段字段查找方法(spring查询数据库)

10

本文将为您提供关于java–Spring数据存储库的字段字段查找方法的详细介绍,我们还将为您解释spring查询数据库的相关知识,同时,我们还将为您提供关于Jackson与SpringBoot的实现:

本文将为您提供关于java – Spring数据存储库的字段字段查找方法的详细介绍,我们还将为您解释spring查询数据库的相关知识,同时,我们还将为您提供关于Jackson 与 SpringBoot 的实现:获取请求中存在的字段名称以及相应的字段映射、Java SE + Spring数据+休眠、java – Spring Roo更新密码字段或不更新所有字段、java – spring-data-cassandra存储库的多个密钥空间支持?的实用信息。

本文目录一览:

java – Spring数据存储库的字段字段查找方法(spring查询数据库)

java – Spring数据存储库的字段字段查找方法(spring查询数据库)

我有两个实体,一个用户和一个注册用户.

注册用户具有user类型的字段.我想在Spring注册用户实体的数据存储库中有一个方法,通过连接到注册用户的用户的用户名搜索所有注册用户.

因此,这是具有关联用户字段的注册用户实体:

@Entity
public class RegisteredUser implements Serializable {

    ... 
    @OnetoOne
    @JoinColumn(name = "USERNAME_FK")
    private User user;
    ...
}

这是一个用户名:

@Entity
public class User implements Serializable { 
    ...
    @Id
    @Column(nullable = false)
    protected String username;
    ...
}
最佳答案
Spring Data(至少1.12.x版本)使用PropertyPath#from方法为从方法名称构造的谓词提取属性的路径.根据sources,它使用下划线作为“字段分隔符”.所以第一个变体如下

public interface RegisteredUserRepository extends CrudRepository

如果找不到整个字段名称,还有一些代码将大写字符作为字段分隔符处理.因此,如果您在RegisteredUser中没有userUsername字段,则第二个varian是

public interface RegisteredUserRepository extends CrudRepository

Jackson 与 SpringBoot 的实现:获取请求中存在的字段名称以及相应的字段映射

Jackson 与 SpringBoot 的实现:获取请求中存在的字段名称以及相应的字段映射

如何解决Jackson 与 SpringBoot 的实现:获取请求中存在的字段名称以及相应的字段映射?

我有一个要求,在如下不同的情况下抛出不同的错误,并且有很多这样的字段,而不仅仅是 1。

例如

  1.    {
        "id": 1,"name": "nameWithSpecialChar$"
       }    
    

    这里应该为特殊字符抛出错误。

  2.    {
         "id": 1,"name": null
       }   
    

    这里抛出字段空错误。

  3.    {
        "id": 1
       }   
    

    这里抛出字段缺失错误。

处理,第 1 和第 2 种情况很容易,但对于第 3 种情况,有什么方法可以让我们在使用 Jackson 进行序列化时在输入 json 中传递的字段名称列表?

一种方法,我可以通过将请求映射到 JsonNode 来实现,然后检查节点是否存在所需字段,然后手动反序列化该 JsonNode,然后验证其余成员,如下所示。

    public ResponseEntity myGetRequest(@RequestBody JsonNode requestJsonNode) {

    if(!requestJsonNode.has("name")){
      throw some error;
    }

    MyRequest request = ObjectMapper.convertValue(requestJsonNode,MyRequest .class);
    validateIfFieldsAreInvalid(request);

但是我不喜欢这种方法,有没有其他方法可以做到?

解决方法

您可以定义一个 JSON schema 并根据它验证您的对象。在您的示例中,您的架构可能如下所示:

{
  "$schema": "https://json-schema.org/draft/2020-12/schema","type": "object","properties": {
    "id": {
      "description": "The identifier","type": "integer"
    },"name": {
      "description": "The item name","type": "string","pattern": "^[a-zA-Z]*$"
    }
  },"required": [ "id","name" ]
}

要验证您的对象,您可以使用 json-schema-validator 库。这个库建立在杰克逊之上。由于您无论如何都在使用 Spring Boot,因此您已经导入了 Jackson。

示例代码大致如下:

String schema = "<define your schema here>";
String data = "<put your data here>";

JsonSchemaFactory factory = JsonSchemaFactory.byDefault();
ObjectMapper m = new ObjectMapper();
JsonSchema jsonSchema = factory.getJsonSchema(m.readTree(schema));
JsonNode json = m.readTree(data);
ProcessingReport report = jsonSchema.validate(json);

System.out.println(report);

报告包含不同输入案例的详细错误。例如,有了这个输入

{
  "id": 1,"name": "nameWithSpecialChar$"
}

这个输出被打印出来

--- BEGIN MESSAGES ---
error: ECMA 262 regex "^[a-zA-Z]*$" does not match input string "nameWithSpecialChar$"
    level: "error"
    schema: {"loadingURI":"#","pointer":"/properties/name"}
    instance: {"pointer":"/name"}
    domain: "validation"
    keyword: "pattern"
    regex: "^[a-zA-Z]*$"
    string: "nameWithSpecialChar$"
---  END MESSAGES  ---

或者不只是打印报告,您可以遍历所有错误并拥有您的特定逻辑

for (ProcessingMessage message : report) {
    // Add your logic here
}

您可以查看 example code 以获取有关如何使用图书馆的更多信息。

Java SE + Spring数据+休眠

Java SE + Spring数据+休眠

我正在尝试使用Spring Data + Hibernate启动Java SE应用程序,并且到目前为止已经完成了以下工作:

配置文件

@Configuration
@PropertySource("classpath:hibernate.properties")
@EnableJpaRepositories
@EnableTransactionManagement
public class JpaConfiguration {

    private static final String PROPERTY_NAME_DATABASE_DRIVER = "db.driver";
    private static final String PROPERTY_NAME_DATABASE_PASSWORD = "db.password";
    private static final String PROPERTY_NAME_DATABASE_URL = "db.url";
    private static final String PROPERTY_NAME_DATABASE_USERNAME = "db.username";

    private static final String PROPERTY_NAME_HIBERNATE_DIALECT = "hibernate.dialect";
    private static final String PROPERTY_NAME_HIBERNATE_SHOW_SQL = "hibernate.show_sql";
    private static final String PROPERTY_NAME_ENTITYMANAGER_PACKAGES_TO_SCAN =
            "entitymanager.packages.to.scan";

    @Resource
    private Environment env;

    @Bean
    public DataSource dataSource() {
        DriverManagerDataSource dataSource = new DriverManagerDataSource();

        dataSource.setDriverClassName(
                env.getRequiredProperty(PROPERTY_NAME_DATABASE_DRIVER));
        dataSource.setUrl(env.getRequiredProperty(PROPERTY_NAME_DATABASE_URL));
        dataSource.setUsername(env.getRequiredProperty(PROPERTY_NAME_DATABASE_USERNAME));
        dataSource.setPassword(env.getRequiredProperty(PROPERTY_NAME_DATABASE_PASSWORD));

        return dataSource;
    }

    @Bean
    public LocalContainerEntityManagerFactoryBean entityManagerFactory() {
        LocalContainerEntityManagerFactoryBean entityManagerFactoryBean = new
                LocalContainerEntityManagerFactoryBean();
        entityManagerFactoryBean.setDataSource(dataSource());
        entityManagerFactoryBean.setPersistenceProviderClass(org.hibernate
                .jpa.HibernatePersistenceProvider.class);
        entityManagerFactoryBean.setPackagesToScan(env.
                getRequiredProperty(PROPERTY_NAME_ENTITYMANAGER_PACKAGES_TO_SCAN));

        entityManagerFactoryBean.setJpaProperties(hibProperties());

        return entityManagerFactoryBean;
    }

    private Properties hibProperties() {
        Properties properties = new Properties();
        properties.put(PROPERTY_NAME_HIBERNATE_DIALECT,env.getRequiredProperty(PROPERTY_NAME_HIBERNATE_DIALECT));
        properties.put(PROPERTY_NAME_HIBERNATE_SHOW_SQL,env.getRequiredProperty(PROPERTY_NAME_HIBERNATE_SHOW_SQL));
        return properties;
    }

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

    @Bean
    public MainBean mainBean() {
        return new MainBean();
    }
}

开始上课

public class Start {


    private static final String CONFIG_PACKAGE = "org.app.config";


    public static void main(String[] args) {

        try (AnnotationConfigApplicationContext ctx = new
                AnnotationConfigApplicationContext()) {

            ctx.scan(CONFIG_PACKAGE);
            ctx.refresh();

            MainBean bean = ctx.getBean(MainBean.class);
            bean.start();
        }
    }
}

主豆

public class MainBean {

        public void start() {

        System.out.println("Application Started. . .");


    }

}

但是我收到以下异常

Exception in thread "main" org.springframework.beans.factory.BeanDefinitionStoreException: Failed to read candidate component class: file [C:\MyPath\target\classes\org\app\config\JpaConfiguration.class]; nested exception is java.lang.IllegalArgumentException
    at org.springframework.context.annotation.ClassPathScanningCandidateComponentProvider.findCandidateComponents(ClassPathScanningCandidateComponentProvider.java:281)
    at org.springframework.context.annotation.ClassPathBeanDefinitionScanner.doScan(ClassPathBeanDefinitionScanner.java:242)
    at org.springframework.context.annotation.ClassPathBeanDefinitionScanner.scan(ClassPathBeanDefinitionScanner.java:220)
    at org.springframework.context.annotation.AnnotationConfigApplicationContext.scan(AnnotationConfigApplicationContext.java:153)
    at org.app.Start.main(Start.java:25)
Caused by: java.lang.IllegalArgumentException
    at org.springframework.asm.ClassReader.<init>(Unknown Source)
    at org.springframework.asm.ClassReader.<init>(Unknown Source)
    at org.springframework.asm.ClassReader.<init>(Unknown Source)
    at org.springframework.core.type.classreading.SimpleMetadataReader.<init>(SimpleMetadataReader.java:52)
    at org.springframework.core.type.classreading.SimpleMetadataReaderFactory.getMetadataReader(SimpleMetadataReaderFactory.java:80)
    at org.springframework.core.type.classreading.CachingMetadataReaderFactory.getMetadataReader(CachingMetadataReaderFactory.java:101)
    at org.springframework.context.annotation.ClassPathScanningCandidateComponentProvider.findCandidateComponents(ClassPathScanningCandidateComponentProvider.java:257)
    ... 4 more

有人知道我在做什么错吗?

java – Spring Roo更新密码字段或不更新所有字段

java – Spring Roo更新密码字段或不更新所有字段

我有一个实体用户,有用户名,姓名等…

用户还有一个密码属性.我在列表/显示表单中禁用了它的渲染,但在更新表单中,字段设置为type =“password”.

我不知道的是,如果没有重新输入密码就无法更新用户,因为没有明星,如果你没有输入密码,密码设置为null或“”.

我怎么能绕过那个?

还有另一个问题.如果我从更新表单中删除一些字段,则所有其他字段都设置为null.
我想要的是使用户能够更新某些权利的某些领域,但不是所有领域.

解决方法

我用四个字段f1,f2,f3和f4创建了一个实体Foo.

在这个实体的update.jspx中,我为字段f1设置了属性render =“false”.

在FooController更新方法中,在更新foo参数对象之前,我从db中获取旧值并将其粘贴到参数foo中,如下所示,因为我们不希望最终用户更新此字段.

Foo fromDB=Foo.findFoo(foo.getId());
    foo.setF1(fromDB.getF1());
    foo.merge();

我能够验证更新操作完成后Foo实体中f1的旧值没有得到更改.

这可能是阻止用户更新实体对象中某些字段的一种方法,并希望这种方法适合您.

干杯,

java – spring-data-cassandra存储库的多个密钥空间支持?

java – spring-data-cassandra存储库的多个密钥空间支持?

Spring Data Cassandra是否支持同一应用程序上下文中的多个键空间存储库?我正在使用以下 JavaConfig类设置cassandra spring数据配置
@Configuration
@EnableCassandraRepositories(basePackages = "com.blah.repository")
public class CassandraConfig extends AbstractCassandraConfiguration {

@Override
public String getKeyspaceName() {
    return "keyspace1";
}

在将存储库类移动到另一个包之后,我尝试创建第二个配置类.

@Configuration
@EnableCassandraRepositories(basePackages = "com.blah.secondrepository")
public class SecondCassandraConfig extends AbstractCassandraConfiguration {

@Override
public String getKeyspaceName() {
    return "keyspace2";
}

但是,在这种情况下,第一个集合,如果存储库失败,因为在键空间中找不到实体的已配置列族.我认为它可能正在寻找第二个键空间中的列族.

spring-data-cassandra是否支持多个密钥空间存储库?我找到多个键空间的引用的唯一地方是here.但它没有解释是否可以使用存储库完成此操作?

解决方法

工作APP样本:
http://valchkou.com/spring-boot-cassandra.html#multikeyspace

您需要的Idea会覆盖默认bean:s​​essionfactory和template

样品:

1)application.yml

spring:
  data:
    cassandra:
      test1:
        keyspace-name: test1_keyspace
        contact-points: localhost
      test2:
        keyspace-name: test2_keyspace
        contact-points: localhost

2)基本配置类

public abstract class CassandraBaseConfig extends AbstractCassandraConfiguration{
    protected String contactPoints;
    protected String keyspaceName;

    public String getContactPoints() {
        return contactPoints;
    }
    public void setContactPoints(String contactPoints) {
        this.contactPoints = contactPoints;
    }

    public void setKeyspaceName(String keyspaceName) {
        this.keyspaceName = keyspaceName;
    }
    @Override
    protected String getKeyspaceName() {
        return keyspaceName;
    }
}

3)配置test1的实现

package com.sample.repo.test1;

@Configuration
@ConfigurationProperties("spring.data.cassandra.test1")
@EnableCassandraRepositories(
        basePackages = "com.sample.repo.test1",cassandratemplateRef = "test1Template"
)
public class Test1Config extends CassandraBaseConfig {

    @Override
    @Primary
    @Bean(name = "test1Template")
    public CassandraAdminoperations cassandratemplate() throws Exception {
        return new CassandraAdminTemplate(session().getobject(),cassandraConverter());
    }

    @Override
    @Bean(name = "test1Session")
    public CassandraSessionfactorybean session() throws Exception {

        CassandraSessionfactorybean session = new CassandraSessionfactorybean();

        session.setCluster(cluster().getobject());
        session.setConverter(cassandraConverter());
        session.setKeyspaceName(getKeyspaceName());
        session.setSchemaAction(getSchemaAction());
        session.setStartupScripts(getStartupScripts());
        session.setShutdownScripts(getShutdownScripts());

        return session;
    }
}

4)同样适用于test2,只需使用不同的包
package com.sample.repo.test2;

5)在专用包中为每个键空间放置repo

package com.sample.repo.test1;

@Repository
public interface RepositoryForTest1 extends CassandraRepository<MyEntity> {
// ....
}


package com.sample.repo.test2;

@Repository
public interface RepositoryForTest2 extends CassandraRepository<MyEntity> {
// ....
}

关于java – Spring数据存储库的字段字段查找方法spring查询数据库的介绍已经告一段落,感谢您的耐心阅读,如果想了解更多关于Jackson 与 SpringBoot 的实现:获取请求中存在的字段名称以及相应的字段映射、Java SE + Spring数据+休眠、java – Spring Roo更新密码字段或不更新所有字段、java – spring-data-cassandra存储库的多个密钥空间支持?的相关信息,请在本站寻找。

本文标签: