将返回表的Postgres函数与Hibernate映射

3

我已经在stackoverflow和其他网站上搜索了很久,但我无法弄清楚如何在Spring应用程序中使用Hibernate映射从Postgres函数返回的表。

我甚至不确定是否可以将Postgres函数返回的表与MyCustomTable匹配。

我正在尝试的是从Spring应用程序中使用Hibernate调用Postgres函数(存储过程)。

我有这个Postgres函数:

CREATE OR REPLACE FUNCTION func99(type text,start_date TIMESTAMP, end_date TIMESTAMP) RETURNS TABLE(
    some_day TIMESTAMP,
    tot_requests BIGINT)
 AS $$
 BEGIN
   RETURN QUERY
   SELECT t1.first_date, COUNT(*) FROM table1 t1
   WHERE t1.request_type = type and t1.first_date > start_date and t1.first_date < end_date;
 END;
 $$ LANGUAGE PLpgSQL;

控制器

@GetMapping("/users/{username}/func99")
    public List<MyCustomTable> getResultsFromFunc99(@PathVariable(value = "username") String username,
                                                 @CurrentUser UserPrincipal currentUser,
                                                 @RequestParam(value = "service_type") String type,
                                                 @RequestParam(value = "start_date") Timestamp startDate,
                                                 @RequestParam(value = "end_date") Timestamp endDate){

        return queryService.getResultsFromFunc99(username, currentUser, type, startDate, endDate);
    }

服务

public List<MyCustomTable> getResultsFromFunc99(String username, UserPrincipal currentUser, String type, Timestamp startDate, Timestamp endDate) {

        User user = userRepository.findByUsername(username)
                .orElseThrow(() -> new ResourceNotFoundException("User", "username", username));

      
        return return incidentRepository.func99(type, startDate, endDate);

仓库

@Procedure(procedureName = "func99")
    List<MyCustomTable> func99(String type, Timestamp startDate, Timestamp endDate);

实体

@Entity
@NamedStoredProcedureQuery(
        name = "func99",
        procedureName = "func99",
        parameters = {
                @StoredProcedureParameter(name = "type", mode = ParameterMode.IN, type = String.class),
                @StoredProcedureParameter(name = "start_date", mode = ParameterMode.IN, type = Timestamp.class),
                @StoredProcedureParameter(name = "end_date", mode = ParameterMode.IN, type = Timestamp.class)
        }
)
@Table(name = "table1")
public class MyCustomTable {...}

当Postgres函数返回整数时,我可以让它正常工作。我该如何映射来自Postgres函数的表返回值,并将其与Hibernate集成?


我得到的错误是:类型不能为空;嵌套异常是java.lang.IllegalArgumentException: 类型不能为空。 - paraflou
2个回答

0
这是我用于类似问题的解决方法,可能适用。
定义一个类似以下的 SqlResultSetMapping:
@SqlResultSetMapping(
    name = "MyCustomTableMapping",
    entities = @EntityResult(entityClass = MyCustomTable.class)
)

然后将此参数更改为您的NamedStoredProcedureQuery注释:

resultSetMappings = "MyCustomTableMapping"

我使用这个技巧与NamedNativeQueries一起使用,以确保Hibernate不跟踪它们的更改,就像实际实体一样。 这可以节省我和同事们许多需要记住detach大量实体的工作。几乎所有关于如何使用与表不相对应的搜索结果的教程都会让您面临这个问题,并将其视为可以接受的。

0

我找到了一个可行的解决方案。

我没有使用存储库中的方法。 而是使用了上述存储库之外的方法:

*@Procedure(procedureName = "func99")
    List<MyCustomTable> func99(String type, Timestamp startDate, Timestamp endDate);*

我知道如何在服务中完成此操作,而无需使用存储库:

@PersistenceContext
    EntityManager em;

.

public List<MyCustomTable> getResultsFromFunc99(String username, UserPrincipal currentUser, String type, Timestamp startDate, Timestamp endDate) {
    User user = userRepository.findByUsername(username)
            .orElseThrow(() -> new ResourceNotFoundException("User", "username", username));

 Query query = em.createNamedStoredProcedureQuery("func99");
        query.setParameter("some_day", someDay);
        ((StoredProcedureQuery) query).execute();

return query.getResultList()

实体类在我声明时保持不变

@Entity
@NamedStoredProcedureQuery(
        name = "func99",
        procedureName = "func99",
        parameters = {
                @StoredProcedureParameter(name = "type", mode = ParameterMode.IN, type = String.class),
                @StoredProcedureParameter(name = "start_date", mode = ParameterMode.IN, type = Timestamp.class),
                @StoredProcedureParameter(name = "end_date", mode = ParameterMode.IN, type = Timestamp.class)
        }
)
@Table(name = "table1")
public class MyCustomTable {...}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接