如何在数据库上执行原始 SQL(而不是在特定 table 上)

How to execute raw SQL on DB (not on specific table)

我在我的应用程序中使用 PostgreSQL 和 ORMlite,它们在 Windows 服务器上运行。在创建所有 table 之前,我需要验证数据库是否存在于 Postgres 中,如果不存在,我必须创建它。

我已经有了 SQL 原始的:

问题:如何使用 ORMLite 执行该操作? 我知道要执行原始 SQL 我可以使用:

myDAO.executeRaw(SQL);

但是这里不在特定的table上,所以我不能使用它,因为我不能创建myDAO。

我没有寻找它,但除了你的之外可能还有其他(更好的)解决方案。

通常,将应用程序和基础结构耦合起来并不是一个好的方法。您的 PostgreSql 是您的基础设施的一部分,您的应用程序不应该关心您的基础设施是否已设置。

更好的方法是拆分您的基础架构定义,可能使用简单的 Bash 脚本或(理想情况下)类似 Terraform 不要耦合 您的基础设施中的应用程序。

我也同意这不是好的做法。
但是您的意图在 ormLite 中是可能的。
您可以使用原始查询任何 DAO。 DAO 在 table.

中没有严格的限制

参考我的示例代码。

sqls.xml :它包含原始查询。您可以定义任何原始查询。

<item name="sql_login" type="string">
    SELECT AdminPubTBL.*
    FROM PDARunPubTBL
    JOIN AdminPubTBL ON PDARunPubTBL.AdminSeqNo = AdminPubTBL.AdminSeqNo
    .....
      AND AdminPubTBL.AdminPwd = \'@adminPwd\' LIMIT 1
</item>

adminDao.java

public interface AdminDao {
    Admin login(int pdaSeqNo, int sectionSeqNo, String adminId, String adminPwd, String corpCode);

adminDaoOrmLite.java :您可以对任何 Java 对象使用 queryRaw 和 return。

public class AdminDaoOrmLite implements AdminDao {
    @Nullable
    private DatabaseHelper databaseHelper = null;
    @Nullable
    private Dao<Admin, Integer> adminDao = null;
    public Admin login(int pdaSeqNo, int sectionSeqNo, @NonNull String adminId, String adminPwd, String corpCode) {
        String sql = context.getResources().getString(R.string.sql_login)
                .replace("@pdaSeqNo", String.valueOf(pdaSeqNo))
                .replace("@sectionSeqNo", String.valueOf(sectionSeqNo))
                .replace("@adminId", adminId)
                .replace("@adminPwd", hashedPassword(adminPwd,corpCode));
        try {
            return adminDao.queryRaw(sql, adminDao.getRawRowMapper()).getFirstResult();
        } catch (SQLException e) {
            LOG.error(e);
        }
    }

所以如果你想要原始查询。制作普通DAO,然后执行.queryRaw()