用hibernate执行本机sql

ocebsuys  于 2023-06-23  发布在  其他
关注(0)|答案(5)|浏览(130)

我正在使用hibernate 4.2.6PostgreSQL 9.1,我一直在尝试使用hibernate执行sql查询。我写过:

Session session = Hibernate.util.HibernateUtil.getSessionFactory().openSession();
session.beginTransaction();
String sql = String.format("INSERT INTO products (name,cost) VALUES('%s',%s);", product.getName(), product.getCost());
createSQLQuery(sql);//has no effect. Query doesn't execute.
session.getTransaction().commit();
session.close();

此查询不在DB中执行。但如果我写

String sql = String.format("INSERT INTO products (name,cost) VALUES('%s',%s);", product.getName(), product.getCost());
Properties connectionProps = new Properties();
connectionProps.put("user", "postgres");
connectionProps.put("password", "123");
Connection conn = DriverManager.getConnection("jdbc:postgresql://localhost:5432/solid",connectionProps);
conn.createStatement().execute(sql);

相应的行将添加到表中。为什么Hibernate不能工作,但是JDBC的原生查询可以工作?

mwkjh3gx

mwkjh3gx1#

这个应该对你有帮助

Session session = Hibernate.util.HibernateUtil.getSessionFactory().openSession();
session.beginTransaction();
String sql = String.format("INSERT INTO products (name,cost) VALUES('%s',%s);",product.getName(), product.getCost());
session.createSQLQuery(sql).executeUpdate();
session.getTransaction().commit();
session.close();
zfycwa2u

zfycwa2u2#

使用PreparedStatement (你不想给予位于SQL注入) 总是更好。

String sql = "INSERT INTO products (name,cost) VALUES (?,?)";

Session sess = Hibernate.util.HibernateUtil.getSessionFactory().openSession();
Connection con = sess.connection();
PreparedStatement pstmt = con.prepareStatement(sql);

pstmt.setString(1, product.getName());
pstmt.setInt(2, product.getCost());

pstmt.executeUpdate();

con.commit();
pstmt.close();
xesrikrc

xesrikrc3#

另一个可能打击你(就像打击我一样)的问题是:
您想运行本机查询,但无法使其在生产代码中工作?如果您对应用程序使用的数据库用户与模式所有者不同,请注意。在这种情况下,您可能必须将模式前缀添加到所引用的表中,以便使其工作。
在我的示例中,我使用实体管理器而不是会话:

String sql = "select id from some_table";
Query query = em.createNativeQuery(sql);
List<Long> results = query.getResultList();

如果some_table由例如dba当应用程序以用户身份运行时,您需要将查询修改为:

String sql = "select id from dba.some_table";

将Hibernate设置为在所有表前面加上

<prop key="hibernate.default_schema">dba</prop>

显然不会影响本地查询。

huus2vyu

huus2vyu4#

对我有效的解决方案如下:

public List<T> queryNativeExecute(String query) throws CustomException {
        List<T> result =null;
        Session session =null;
        Transaction transaction=null; 
        try{
            session = HibernateUtil.getSessionJavaConfigFactory().openSession();
            transaction = session.beginTransaction();
            session.createNativeQuery(query).executeUpdate();
            transaction.commit();
        }catch(Exception exception){
            result=null;
            if (transaction !=null && transaction.isActive()){
                transaction.rollback();
            }
            throw new CustomException(exception.getMessage(),exception,error.ErrorCode.DATABASE_TABLE,this.getClass().getSimpleName());
        }finally{
            if (session !=null){
                session.close();    
            }
        }

        return result;
    }
h79rfbju

h79rfbju5#

我在spring-boot和hibernate5.4.2中使用了实体管理器

@Autowired
EntityManager em;

public List<String> getDistinctColumnValues(String tableName, String columnName) {

    List<String> result = em.createNativeQuery("select distinct (" + columnName + ") from " + tableName).getResultList();
    return result;
}

相关问题