当前位置: 首页 > 知识库问答 >
问题:

如何在不自动创建表的情况下生成实体类

归德厚
2023-03-14

我为我的系统创建了一些报告,该报告由许多表组成。为此,我创建了一个带有@Entity注释的域类,并实现了一个JpaRepository存储库,我将本机查询与@query一起使用,如下所示。

我的问题是,对于每个域类,hibernate都在创建一个表,如何停止它?

我的域类:

@Entity
@Immutable
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@IdClass(WidgetDailyReportCompositeKey.class)
public class WidgetDailyReportDomain{

    @Id
    @Column(updatable = false, insertable = false)
    private UUID id_construction;

    @Id
    @Column(updatable = false, insertable = false)
    private String name;

    @Id
    @Column(updatable = false, insertable = false)
    private Date dt_cost;

    @Column(updatable = false, insertable = false)
    private Double total;
}

我的存储库:

public interface WidgetRepository extends JpaRepository<WidgetDailyReportDomain, UUID>{

    @Query(value =  "     SELECT ct.id AS id_construction,                                                                                              " +
                    "            ct.name,                                                                                                               " +
                    "            sm.dt_service AS dt_cost,                                                                                              " +
                    "            sum(smi.nu_value * stiv.amount) AS total                                                                               " +
                    "       FROM service_measurement sm                                                                                                 " +
                    " INNER JOIN service_measurement_item smi   ON smi.id_service_measurement = sm.id                                                   " +
                    " INNER JOIN service s                      ON s.id                       = sm.id_service                                           " +
                    " INNER JOIN service_type_item_service stiv ON stiv.id_service            = sm.id_service                                           " +
                    "                                          AND stiv.id_service_type_item = smi.id_service_item                                      " +
                    " INNER JOIN construction ct                ON ct.id                      = s.id_construction                                       " +
                    "      WHERE s.id_construction IN (                                                                                                 " +
                    "                                   select s.id_construction                                                                        " +
                    "                                   from service_measurement sm                                                                     " +
                    "                                   INNER JOIN service_measurement_item smi   ON smi.id_service_measurement = sm.id                 " +
                    "                                   INNER JOIN service s                      ON s.id                       = sm.id_service         " +
                    "                                   INNER JOIN service_type_item_service stiv ON stiv.id_service            = sm.id_service         " +
                    "                                                                            AND stiv.id_service_type_item  = smi.id_service_item   " +
                    "                                   INNER JOIN construction ct                on ct.id                      = s.id_construction     " +
                    "                                   WHERE sm.dt_service BETWEEN :minDate AND :maxDate                                               " +
                    "                                   GROUP BY s.id_construction                                                                      " +
                    "                                   ORDER BY sum(smi.nu_value * stiv.value) DESC                                                    " +
                    "                                   limit :limit                                                                                    " +
                    "       )                                                                                                                           " +
                    "       AND sm.dt_service BETWEEN :minDate AND :maxDate                                                                             " +
                    "  GROUP BY ct.id, sm.dt_service                                                                                                    " +
                    "    HAVING sum(smi.nu_value * stiv.amount) > 0                                                                                     " +
                    "  ORDER BY sm.dt_service;", nativeQuery = true)
    List<WidgetDailyReportDomain> findTopExpensiveConstruction(@Param("minDate") Date minDate, @Param("maxDate") Date maxDate, @Param("limit") int limit);

//....

共有3个答案

法弘壮
2023-03-14

由于您的问题中有一个假设,您似乎正在使用Spring。

如果您使用的是Spring Boot,那么您可以添加

spring:
  jpa:
    hibernate:
      ddl-auto: none

到您的application.yml文件,或

spring.jpa.hibernate.ddl-auto=none

到您的应用程序。属性文件。

如果您使用的是持久性。xml文件,您也可以在其中添加属性以禁用它:

<property name="hibernate.hbm2ddl.auto" value="none"/>

但是,禁用这样的模式表的生成意味着您必须确保在应用程序正常工作之前通过其他方式创建它们。

勾起运
2023-03-14

您可以删除所有的javax.persistence注释,如@Col列@Id@Entity。这些注释表示表的属性,您似乎不希望它是这样。

然后,可以使用WidgetDailyReportDomain对象作为DTO作为投影,而不将其附加到EntityManager:https://docs.spring.io/spring-data/jpa/docs/current/reference/html/#projections.dtos

编辑:另外,不要忘记为该对象构建构造函数,以便Spring JPA将值加载到该对象中(如文档中所述)。如果不想构建构造函数,可以将其更改为接口并将其用作投影:https://docs.spring.io/spring-data/jpa/docs/current/reference/html/#projections.interfaces

钦海荣
2023-03-14

您的WidgetDailyReportDomain实际上是投影。您不需要将其标记为@实体。您的@查询可能属于任何其他真正现有的存储库。

 类似资料:
  • 我即将对我的项目进行一个重大的技术更改,从ANT转移到Gradle。这个项目从来没有发布过--它仍在开发中。我想标记最后的旧技术版本,以便可以找到参考或逆转。但我不想暗示有任何一种释放。 然后 我之前向GitHub提交了一个支持请求,但当时他们有一些支持积压,所以我的请求被关闭了。

  • 本文向大家介绍如何在不使用HTML的情况下创建网站?,包括了如何在不使用HTML的情况下创建网站?的使用技巧和注意事项,需要的朋友参考一下 如果您不了解HTML或CSS,并且想创建一个网站,那么不用担心,您可以轻松创建网站,而无需编写一行HTML代码。 以下是一些无需编写任何HTML或代码行即可构建网站的方法: 网站构造函数 当您购买网站托管计划时,托管公司将为您提供免费的网站构建器选项,以轻松创

  • 我想实现UI矩阵模式,它应该动态生成。通过接收输入参数,它应该决定什么是UI矩阵模式维度:例如9X3元素:模式9X3要素 我使用Angular2.js、typescript和SCSS。 html模板和。ts外观: ** 此代码无法在此环境中运行:)* 问:如何在不创建数组来生成 UI 的情况下使用 NgFor。我的意思是,如果我收到输入x = 9和y = 3,它应该构建9X3的UI矩阵模式。请告知

  • 我的javaFX项目中有一辆汽车,当空间被挤压时,汽车(节点)的位置应该改变(汽车应该平滑地跳跃)。所以我使用了一个事件处理程序来调用一个名为< code>moveUp()的方法 这创建了一个新的线程,其中汽车的速度以75毫秒的间隔改变10次。 如果我不使用其他线程,GUI线程将被冻结,如果我不使用Thread.sleep(),汽车将突然跳跃(不顺利)。这段代码做得很好。但是我了解到 并不能保证线

  • 问题内容: 有什么方法可以避免在初始化类时调用类,例如从类方法中调用? 我试图在Python中创建一个不区分大小写和标点符号的字符串类,以进行有效的比较,但是在不调用的情况下创建新实例时遇到了麻烦。 我应该替换为什么以用切片初始化新对象? 编辑: 受到以下答案的启发,已对初始化程序进行了编辑,以快速检查是否没有参数。 问题答案: 在此示例中,使用元类提供了一个不错的解决方案。元类的用途有限,但效果

  • 在C语言中,我可以用和调用来创建新文件,当且仅当当前没有同名文件时。我还没能在哈斯克尔找到这样做的方法。我更喜欢提供的友好的东西,最好是为我完成所有棘手的异常处理。(我不一定期望它能正确地为我完成,但那是另一回事。)