postgresql Spring Boot 中的接口凸起

dgiusagp  于 2023-11-18  发布在  PostgreSQL
关注(0)|答案(1)|浏览(140)

在我的Spring Boot 项目中,我必须创建一个db视图,通过连接它们来从几个表中获取一些数据。查询工作得很好。下面是我的查询部分。

CREATE VIEW "admin-service".view_system_user_access AS
      SELECT
           systemUser.id AS userId,
           systemUser.user_name AS userName,
           role.id AS roleId,
           role.name AS roleName,
           userRole.read_only AS userRoleReadOnly,
           form.id AS formId,
           form.name AS formName,
           form.url_path AS urlPath,
           formAccess.read_only AS formAccessReadOnly,
           formTab.id AS formTabId,
           formTab.name AS formTabName,

FROM system_user systemUser
INNER JOIN ....

字符串
请关注我选择的列(我没有把完整的查询放在这里)。在那里我有很多选择。为了在java中将它们Map到DTO中,我使用了接口投影,如下所示。

interface UserAccess {
        Optional<Long> getUserId();
        Optional<String> getUserName();
        Optional<Long> getRoleId();
        Optional<String> getRoleName();
        Optional<Boolean> getUserRoleReadOnly();
        Optional<Long> getFormId();
        Optional<String> getFormName();
        Optional<String> getUrlPath();
        Optional<Boolean> getFormAccessReadOnly();
        Optional<Long> getFormTabId();
        Optional<String> getFormTabName();
        Optional<Boolean> getFormTabAccessReadOnly();
        Optional<Long> getBranchId();
        Optional<String> getBranchName();
        Optional<Boolean> getBranchAccessReadOnly();
        Optional<Long> getEntityId();
        Optional<String> getEntityName();
        Optional<Boolean> getEntityAccessReadOnly();
        Optional<Long> getOrgId();
        Optional<String> getOrgName();
    }


正如你在那里看到的,我必须为查询中的所有选择编写get方法。所以我的问题是要知道两件事。(请记住,我的要求是从db中的视图中获取数据。也没有实体类)
1.这样的做法是否可以?
1.有没有更好的办法?如果有,请提出你的建议。

k3fezbri

k3fezbri1#

如果它能工作,它是安全的,它是快速的,那么它是好的。所以你需要分析你的解决方案,并检测是否有任何东西阻止它是好的,并修复它。
view的使用表明你有一个连接查询。这可能适用于较小和不那么忙碌的系统,但可能会在较大和繁忙的系统上造成巨大的麻烦。所以,你需要带着一粒盐,小心使用它。如果它现在工作得很好,你可以让它保持原样,但是,如果它开始以低于足够的速度执行,例如,然后你可能想创建一个表而不是视图,并使用cron作业,你可能想定期刷新它,所以繁重的工作将每小时只做一次,例如,而不是在每个请求时。
至于字段,如果它太多,你可以通过编写代码来生成你的DTO。循环列,看看里面有什么值,你可以实现一个代码,或多或少地可靠地自动检测它们的getter的名称和类型。实现这样一个助手需要很多时间,但是如果你有成千上万的列,你要长期推断它们的类型,当然,这样的系统可能会出错,但最好是为1000列修复代码的10-15个错误,而不是使用Map器手动Map1000列,并实际输入所有代码。

相关问题