如何使用CrudRepository从数据库中获取'现在时间'?

问题描述:

我有实体的这个例子:如何使用CrudRepository从数据库中获取'现在时间'?

@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(); 

从用户设置creationDate。

我需要一个新的回购获得时间,或者我可以使用此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 
+2

我会说,如果“有人”是允许的,并如果改变生产服务器的时间,你会遇到比创建日期错误更大的问题。从数据库获取当前tme不会有太大变化,因为这些人可能也会更改数据库服务器上的时间。 –

+0

为什么该方法被标注为修改并且只读为false? –

+0

@JBNizet,在这种情况下,有必要这样做。 – laccf

我解决了这一点做用

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

,在UserReposistory:

@Transactional(readOnly = false) 
@Query("select CURRENT_TIMESTAMP from User") 
public Date getCurrentTime(); 

Caused by: java.lang.IllegalArgumentException: Not a managed type: class java.util.Date因为日期是不是一个实体,所以你不能使用你的UtilsRepository原样。你应该能够在您的UserRepository

+0

我做了这样的事情,@Sean。稍后我会发布解决方案。谢谢。 – laccf