如何在DB上执行原始SQL(不在特定的表上)

时间:2017-12-15 11:03:54

标签: java sql postgresql ormlite

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

我已经拥有了我的SQL Raw:

  • 检查是否存在:
    final String SQL = "SELECT 1 from pg_database WHERE datname='MY_NOME_DB' ;";

  • 创建它(如果不存在):
    String SQL= "CREATE DATABASE MY_NOME_DB ; " ;

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

myDAO.executeRaw(SQL);

但是这里不是特定的表,所以我不能使用它因为我无法创建myDAO。

2 个答案:

答案 0 :(得分:1)

我没有找过它,但可能还有其他(更好的)解决方案,而不是你的。

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

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

答案 1 :(得分:1)

我也同意这不是好习惯 但是你的意图可以在ormLite中使用 您可以使用原始查询任何DAO。 DAO并没有严格限制在表格中。

参考我的示例代码。

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:您可以使用queryRaw并返回任何Java对象。

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()