我正在使用Hibernate进行数据库访问。我在我的代码中使用以下查询来获取我需要的数据:
SELECT proasset
FROM com.company.claims.participant.AbstractBeneficiary bene
JOIN bene.approvals approval
JOIN bene.proassetkey proasset
join proasset.relatedparties proassetparties
WHERE approval.user_dt > :currentDate
AND approval.user_type = :userType
我在下面将它用作query
:
Query q = this.getSessionFactory().getCurrentSession().createSQLQuery(query.toString())
q.setDate("currentDate", new Date());
q.setString("userType", APPROVER_USER_TYPE);
List<ProAsset> proassets = q.list();
但是,尝试运行时会遇到以下情况:
SQL Error: 933, SQLState: 42000
ORA-00933: SQL command not properly ended
如果重要,则使用StringBuilder
构建查询,并使用\n
来分隔行
对这个问题的任何想法?
答案 0 :(得分:4)
看起来您正在尝试将ORM与本机(普通旧SQL)查询混合使用。
createSQLQuery需要本机SQL。您正在使用类而不是表名。试一试:
http://docs.jboss.org/hibernate/orm/3.3/reference/en/html/querysql.html
简而言之,您需要编写如下查询:
select fu
from bar
where situation = 'snafu'
也许你真的想写一个namedQuery?他们使用ORM语法来加入实体,就像您在示例中所做的那样。
检查这些例子:
http://docs.jboss.org/hibernate/orm/3.3/reference/en/html/querysql.html#querysql-namedqueries
答案 1 :(得分:0)
通过删除不合适的子句来更正语法。可以使用另一个SQL语句复制已删除的子句。例如,要对视图的行进行排序,请在查询视图时进行,而不是在创建视图时进行。如果延续行缩进,则SQL * Forms应用程序中也会发生此错误。检查缩进行并删除这些空格。
答案 2 :(得分:0)
好吧,所以我使用createSQLQuery()而不是createQuery(),我使用的是列名而不是变量名。
以下是我的代码现在的样子:
StringBuilder query = new StringBuilder();
query.append("SELECT proasset\n" +
"FROM com.avivausa.claims.participant.AbstractBeneficiary bene\n" +
"JOIN bene.approvals approval\n" +
"JOIN bene.proAsset proasset\n" +
"join proasset.additionalParties proassetparties\n" +
"WHERE approval.userDate < current_date()\n");
query.append("AND approval.userType = ").append(UserAuditType.APPROVER);
Query q = this.getSessionFactory().getCurrentSession().createQuery(query.toString());
List<ProAsset> proassets = q.list();
显然我也做了一些重构更改,但主要的变化是我上面所说的。感谢您的回复!