Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在扩展crud存储库时,如何使用自己的查询进行保存操作?_Java_Spring_Postgresql_Hibernate_Jpa - Fatal编程技术网

Java 在扩展crud存储库时,如何使用自己的查询进行保存操作?

Java 在扩展crud存储库时,如何使用自己的查询进行保存操作?,java,spring,postgresql,hibernate,jpa,Java,Spring,Postgresql,Hibernate,Jpa,我正在扩展spring.data的crudepository并使用自定义查询 public interface CustomerRepo extends CrudRepository<Customer, Long> { @Query(value = "SELECT extract(isodow(birthday)) FROM customer WHERE id = :customer_id", nativeQuery = true) LocalTime findDa

我正在扩展spring.data的crudepository并使用自定义查询

public interface CustomerRepo extends CrudRepository<Customer, Long> {

    @Query(value = "SELECT extract(isodow(birthday)) FROM customer WHERE id = :customer_id", nativeQuery = true)
    LocalTime findDayOfBirthById(@Param("customer_id") Long id);
但它不起作用。有没有用自己的sql查询覆盖标准save方法的简单解决方案?我想知道做这件事的一般方法

我收到的错误是:

org.postgresql.util.PSQLException: The query does not return a result.
    at org.postgresql.jdbc.PgPreparedStatement.executeQuery(PgPreparedStatement.java:107) ~[postgresql-42.2.5.jar:42.2.5]
    at com.zaxxer.hikari.pool.ProxyPreparedStatement.executeQuery(ProxyPreparedStatement.java:52) ~[HikariCP-3.2.0.jar:na]
    at com.zaxxer.hikari.pool.HikariProxyPreparedStatement.executeQuery(HikariProxyPreparedStatement.java) ~[HikariCP-3.2.0.jar:na]
    at org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.extract(ResultSetReturnImpl.java:60) ~[hibernate-core-5.3.7.Final.jar:5.3.7.Final]
    at org.hibernate.loader.Loader.getResultSet(Loader.java:2167) ~[hibernate-core-5.3.7.Final.jar:5.3.7.Final]
    at org.hibernate.loader.Loader.executeQueryStatement(Loader.java:1930) ~[hibernate-core-5.3.7.Final.jar:5.3.7.Final]
    at org.hibernate.loader.Loader.executeQueryStatement(Loader.java:1892) ~[hibernate-core-5.3.7.Final.jar:5.3.7.Final]
    at org.hibernate.loader.Loader.doQuery(Loader.java:937) ~[hibernate-core-5.3.7.Final.jar:5.3.7.Final]
    at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:340) ~[hibernate-core-5.3.7.Final.jar:5.3.7.Final]
    at org.hibernate.loader.Loader.doList(Loader.java:2689) ~[hibernate-core-5.3.7.Final.jar:5.3.7.Final]
    at org.hibernate.loader.Loader.doList(Loader.java:2672) ~[hibernate-core-5.3.7.Final.jar:5.3.7.Final]
    at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2506) ~[hibernate-core-5.3.7.Final.jar:5.3.7.Final]
    at org.hibernate.loader.Loader.list(Loader.java:2501) ~[hibernate-core-5.3.7.Final.jar:5.3.7.Final]
    at org.hibernate.loader.custom.CustomLoader.list(CustomLoader.java:338) ~[hibernate-core-5.3.7.Final.jar:5.3.7.Final]
    at org.hibernate.internal.SessionImpl.listCustomQuery(SessionImpl.java:2223) ~[hibernate-core-5.3.7.Final.jar:5.3.7.Final]
    at org.hibernate.internal.AbstractSharedSessionContract.list(AbstractSharedSessionContract.java:1053) ~[hibernate-core-5.3.7.Final.jar:5.3.7.Final]
    at org.hibernate.query.internal.NativeQueryImpl.doList(NativeQueryImpl.java:170) ~[hibernate-core-5.3.7.Final.jar:5.3.7.Final]
    at org.hibernate.query.internal.AbstractProducedQuery.list(AbstractProducedQuery.java:1505) ~[hibernate-core-5.3.7.Final.jar:5.3.7.Final]
    at org.hibernate.query.internal.AbstractProducedQuery.getSingleResult(AbstractProducedQuery.java:1553) ~[hibernate-core-5.3.7.Final.jar:5.3.7.Final]
    at org.springframework.data.jpa.repository.query.JpaQueryExecution$SingleEntityExecution.doExecute(JpaQueryExecution.java:214) ~[spring-data-jpa-2.1.2.RELEASE.jar:2.1.2.RELEASE]
    at org.springframework.data.jpa.repository.query.JpaQueryExecution.execute(JpaQueryExecution.java:91) ~[spring-data-jpa-2.1.2.RELEASE.jar:2.1.2.RELEASE]
    at org.springframework.data.jpa.repository.query.AbstractJpaQuery.doExecute(AbstractJpaQuery.java:136) ~[spring-data-jpa-2.1.2.RELEASE.jar:2.1.2.RELEASE]
    at org.springframework.data.jpa.repository.query.AbstractJpaQuery.execute(AbstractJpaQuery.java:125) ~[spring-data-jpa-2.1.2.RELEASE.jar:2.1.2.RELEASE]

很明显,它没有返回结果,因为它在insert语句中。

当您保持默认行为时,保存将返回您的客户对象

当您不需要保持客户对象和数据库记录同步时,您可以使用

@Modifying
@Query(value = "insert into customer (birthday, name) values (birthday, name);", nativeQuery = true)
    void save(@Param("birthday") LocalDateTime bday, @Param("name") String name);
您可以在存储库上定义自己的扩展 比如说

@NoRepositoryBean
public interface ReadOnlyRepository<T, ID extends Serializable> extends Repository<T, ID> {

    T findOne(ID id);

    Iterable<T> findAll();

    Iterable<T> findAll(Sort sort);

    Page<T> findAll(Pageable pageable);
}
@NoRepositoryBean
公共接口只读存储库扩展存储库{
T findOne(ID);
Iterable findAll();
Iterable findAll(排序);
页面findAll(可分页可分页);
}

将CustomerRepo从这个扩展到另一个,您没有默认的保存方法

当您保持默认行为时,保存将返回您的Customer对象

当您不需要保持客户对象和数据库记录同步时,您可以使用

@Modifying
@Query(value = "insert into customer (birthday, name) values (birthday, name);", nativeQuery = true)
    void save(@Param("birthday") LocalDateTime bday, @Param("name") String name);
您可以在存储库上定义自己的扩展 比如说

@NoRepositoryBean
public interface ReadOnlyRepository<T, ID extends Serializable> extends Repository<T, ID> {

    T findOne(ID id);

    Iterable<T> findAll();

    Iterable<T> findAll(Sort sort);

    Page<T> findAll(Pageable pageable);
}
@NoRepositoryBean
公共接口只读存储库扩展存储库{
T findOne(ID);
Iterable findAll();
Iterable findAll(排序);
页面findAll(可分页可分页);
}

从这个方法扩展CustomerRepo,并且您没有默认的保存方法

请对错误进行堆栈后跟踪请对错误进行堆栈后跟踪,但我想防止其他开发人员使用旧的save()方法,因为在这种情况下,这个方法没有用。这就是为什么我想覆盖它。你应该在你的团队中实施开发最佳实践,因为你有jpa依赖,你不能阻止开发人员使用它。你可以创建自己的存储库扩展并使用它。我在我的回答中添加了一个例子,我刚刚使用了您的建议:只需从存储库扩展即可。然后添加@Modifying注释及其工作。只有两个变化:)。那么,您可以修改上次编辑的内容吗?然后我会将它标记为正确的解决方案,但我想防止其他开发人员使用旧的save()方法,因为在这种情况下,这个方法是无用的。这就是为什么我想覆盖它。你应该在你的团队中实施开发最佳实践,因为你有jpa依赖,你不能阻止开发人员使用它。你可以创建自己的存储库扩展并使用它。我在我的回答中添加了一个例子,我刚刚使用了您的建议:只需从存储库扩展即可。然后添加@Modifying注释及其工作。只有两个变化:)。那么,您可以修改上次编辑的内容吗?然后我会将其标记为正确的解决方案