我正在使用hibernate 4.2.6
和PostgreSQL 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的原生查询可以工作?
5条答案
按热度按时间mwkjh3gx1#
这个应该对你有帮助
zfycwa2u2#
使用PreparedStatement (你不想给予位于SQL注入) 总是更好。
xesrikrc3#
另一个可能打击你(就像打击我一样)的问题是:
您想运行本机查询,但无法使其在生产代码中工作?如果您对应用程序使用的数据库用户与模式所有者不同,请注意。在这种情况下,您可能必须将模式前缀添加到所引用的表中,以便使其工作。
在我的示例中,我使用实体管理器而不是会话:
如果some_table由例如dba当应用程序以用户身份运行时,您需要将查询修改为:
将Hibernate设置为在所有表前面加上
显然不会影响本地查询。
huus2vyu4#
对我有效的解决方案如下:
h79rfbju5#
我在spring-boot和hibernate5.4.2中使用了实体管理器