java - 如何使用 CrudRepository 从数据库获取 'now time'?

标签 java spring spring-data

我有这个实体示例:

@Entity
public class User {

    private String name;
    private Date creationDate;

    public User(String name) {
        this.name = name;
        this.creationDate= Calendar.getInstance().getTime();
    }

}

以及这个存储库示例:

public interface UserRepository extends JpaRepository<User, Long>, JpaSpecificationExecutor<User> {

    public User findByName(String name);

}

但是当我需要做的时候:

User user = new User();

我无法再从以下位置获取creationDate:

Calendar.getInstance().getTime();

因为有些人正在更改操作系统的时间,并且创建的时间被保留为错误的。所以我需要一些:

SELECT SYSDATE FROM DUAL;
SELECT now();

从用户处设置创建日期。

我是否需要一个新的存储库来获取时间,或者我可以使用此 UserRepository 从数据库获取creationDate?我尝试创建一个 UtilsRepository,我可以在其中从数据库获取日期:

public interface UtilsRepository extends JpaRepository<Date, String> {

    @Modifying
    @Transactional(readOnly = false)
    @Query("select now()")
    public Date getDataBaseDate();

}

但是它不起作用。我收到此错误,并且我认为这不是最好的方法。

Exception in Application init method
java.lang.reflect.InvocationTargetException
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at com.sun.javafx.application.LauncherImpl.launchApplicationWithArgs(LauncherImpl.java:389)
    at com.sun.javafx.application.LauncherImpl.launchApplication(LauncherImpl.java:328)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at sun.launcher.LauncherHelper$FXHelper.main(Unknown Source)
Caused by: java.lang.RuntimeException: Exception in Application init method
    at com.sun.javafx.application.LauncherImpl.launchApplication1(LauncherImpl.java:912)
    at com.sun.javafx.application.LauncherImpl.lambda$launchApplication$155(LauncherImpl.java:182)
    at java.lang.Thread.run(Unknown Source)
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'utilsRepository': Invocation of init method failed; nested exception is java.lang.IllegalArgumentException: Not a managed type: class java.util.Date
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1578)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:545)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:482)
    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:306)
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230)
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:302)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:197)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:757)
    at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:861)
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:541)
    at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:759)
    at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:369)
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:313)
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:1185)
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:1174)
    at com.sun.javafx.application.LauncherImpl.launchApplication1(LauncherImpl.java:841)
    ... 2 more
Caused by: java.lang.IllegalArgumentException: Not a managed type: class java.util.Date
    at org.hibernate.jpa.internal.metamodel.MetamodelImpl.managedType(MetamodelImpl.java:210)
    at org.springframework.data.jpa.repository.support.JpaMetamodelEntityInformation.<init>(JpaMetamodelEntityInformation.java:68)
    at org.springframework.data.jpa.repository.support.JpaEntityInformationSupport.getEntityInformation(JpaEntityInformationSupport.java:67)
    at org.springframework.data.jpa.repository.support.JpaRepositoryFactory.getEntityInformation(JpaRepositoryFactory.java:152)
    at org.springframework.data.jpa.repository.support.JpaRepositoryFactory.getTargetRepository(JpaRepositoryFactory.java:99)
    at org.springframework.data.jpa.repository.support.JpaRepositoryFactory.getTargetRepository(JpaRepositoryFactory.java:81)
    at org.springframework.data.repository.core.support.RepositoryFactorySupport.getRepository(RepositoryFactorySupport.java:199)
    at org.springframework.data.repository.core.support.RepositoryFactoryBeanSupport.initAndReturn(RepositoryFactoryBeanSupport.java:266)
    at org.springframework.data.repository.core.support.RepositoryFactoryBeanSupport.afterPropertiesSet(RepositoryFactoryBeanSupport.java:252)
    at org.springframework.data.jpa.repository.support.JpaRepositoryFactoryBean.afterPropertiesSet(JpaRepositoryFactoryBean.java:92)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1637)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1574)
    ... 18 more

最佳答案

Caused by: java.lang.IllegalArgumentException: Not a managed type: class java.util.Date发生这种情况是因为 Date 不是实体,因此您将无法使用 UtilsRepository照原样。您应该能够使用

@Query(value = "SELECT SYSDATE FROM DUAL", nativeQuery = true)

在您的UserRepository

关于java - 如何使用 CrudRepository 从数据库获取 'now time'?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43825906/

相关文章:

java - 为什么这个synchronized block 好像要很久才能拿到锁?

java - Spring Boot JMS - 何时应在 @Transacted 方法上发送消息?

java - Spring boot 1.4.1 embedded tomcat 8 - 日志缓冲 30 秒

java - spring-security oauth2 REST 服务器在错误凭据(400)错误响应中不需要的 Stacktrace

java - Eclipse Neon.2 : Unable to add Gradle Buildship 中的 Spring 启动器插件问题

java - Spring Data + Mongo- 无分组字段求和

Java Spring : Compatibility for both transactional and non-transactional versions of mongodb

java - 将大文本文件插入 netbeans

java - Spring Redis 通过通配符键获取值

mysql - Spring Data 在 OneToMany 上创建内部联接