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