【问题标题】:spring boot modeling MySQL native query result with a class without creating a table entityspring boot 用类建模 MySQL 原生查询结果而不创建表实体
【发布时间】:2021-07-14 19:35:16
【问题描述】:

正如标题所示,我的存储库中有这样的原生 SQL 查询

@Repository
public interface BesoinRepository extends CrudRepository<Statistic, Long>{

    @Query(value="SELECT etat_besoin AS 'state',COUNT(DISTINCT id) AS 'number' FROM besoin WHERE YEAR(date_creation)=:year GROUP BY etat_besoin ",nativeQuery=true)
    List<Object> getStatistic(@Param("year") int year); 
}

类统计

package fr.solinum.management.model;
public class Statistic {
    private String state;
    private int number;
    
    public String getState() {
        return state;
    }
    
    public int getNumber() {
        return number;
    }
}

这工作正常,但我希望getStatistic 的返回类型为List&lt;Statistic&gt;,并且不需要在我的数据库中创建表 Statistic,因为我不需要它。换句话说,我只想从数据库中读取并将结果作为一个类返回。那么模型和存储库或控制器中的变化是什么,或者我的问题的最佳方法是什么?请注意,我修改了我的模型类来解决这个问题,但我不认为这是最佳或好的方法。

package fr.solinum.management.model;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;
@Entity
@Table(name = "besoin")
public class Statistic {
    @Id
    private int id;
    private String state;
    private int number;
    
    public String getState() {
        return state;
    }
    
    public int getNumber() {
        return number;
    }
}

【问题讨论】:

    标签: java spring-boot hibernate


    【解决方案1】:

    我能想到三种方法:

    1. 使用数据库视图。

    有了这个,您可以将您想要的实体作为任何其他表映射到视图。您可以毫无问题地使用存储库,并且无需创建其他表。

    1. 在一个类中映射您的列表并从服务/DAO 访问此数据。

    这需要更多的劳动强度,并且可能不“适合”您的其余代码。您将使用另一个类,而不是直接使用您的存储库。此类将查询对象并映射它们,然后再将它们传递给请求它们的控制器或服务。这就像在做 JPA 的工作,真的。

    以下代码为例:

    @Component
    public class StatisticDAO {
        
        @Autowired
        private BesoinRepository besoinRepository;
    
        public List<Statistic> getStatistic(int year) {
            List<Statistic> result = new ArrayList<>();
            List<Object[]> temp = besoinRepository.getStatistic(year);
            temp.stream().forEach(data -> result.add(build(data)));
            return result;
        }
        
        private Statistic build(Object[] data) {
            return new Statistic(String.valueOf(data[0]), (Integer)data[1]);
        }
    
    }
    

    您需要将列表的类型更改为 Object[] 并检查 JPA 返回属性的顺序。

    1. 使用interface-based projections

    我会推荐方法 1 和 3,但取决于您和更适合您的方法。

    【讨论】:

    • 感谢您的帮助,但经过长时间的搜索,我在您的答案baeldung.com/… 之前找到了我正在寻找的东西,现在我正在练习它。我认为这是第三种方法,看起来最好。
    猜你喜欢
    • 2018-11-30
    • 2021-02-13
    • 2015-05-18
    • 2014-11-12
    • 2014-11-11
    • 1970-01-01
    • 1970-01-01
    • 2019-10-19
    • 1970-01-01
    相关资源
    最近更新 更多