HQL 未从实体名称中获取 table 名称
HQL not getting table name from Entity name
我有一个名为计划的实体。这个实体有一个属性 Planner。
有一种情况,计划员离开公司,他的计划必须分配给其他计划员。
所以我使用实体和属性名称在 hql 中编写了这个查询:
String hql = "update Plan set planner = :newPlanner where planner = :oldPlanner";
Query query = getSession().createSQLQuery(hql);
query.setParameter("newPlanner", newPlanner);
query.setParameter("oldPlanner", oldPlanner);
但是,当我尝试执行它时,Hibernate 生成了这个:
Hibernate:
update
Plan
set
planner = ?
where
planner = ?
2017-03-03 08:56:31 TRACE BasicBinder:81 - binding parameter [2] as [BIGINT] - [5]
2017-03-03 08:56:31 TRACE BasicBinder:81 - binding parameter [1] as [BIGINT] - [6]
2017-03-03 08:56:31 WARN SqlExceptionHelper:144 - SQL Error: 156, SQLState: S1000
2017-03-03 08:56:31 ERROR SqlExceptionHelper:146 - Incorrect syntax near the keyword 'Plan'.
所以你看这里有问题。我的基础 table 称为 "plans",因为 "plan" 是 SQL 中的关键字。我的 table 也是非默认架构的一部分。
HQL 似乎没有用 "schema.plans" 替换 "Plan",它也没有替换计划程序的列名称,它应该是 planner_id。
我是不是做错了什么?我已经编写了其他 HQL 没有问题,但是那些底层 table 名称与实体名称匹配并且都是 Select 语句。
我想我可以只指定基础 table 名称,但这是否意味着我还必须指定列名?我最关心的是模式。我为使用该产品的不同客户使用不同的模式。因此,我不想有任何硬编码模式。
您正在使用 createSQLQuery()
。顾名思义,这需要 SQL,而不是 HQL。
我有一个名为计划的实体。这个实体有一个属性 Planner。
有一种情况,计划员离开公司,他的计划必须分配给其他计划员。
所以我使用实体和属性名称在 hql 中编写了这个查询:
String hql = "update Plan set planner = :newPlanner where planner = :oldPlanner";
Query query = getSession().createSQLQuery(hql);
query.setParameter("newPlanner", newPlanner);
query.setParameter("oldPlanner", oldPlanner);
但是,当我尝试执行它时,Hibernate 生成了这个:
Hibernate:
update
Plan
set
planner = ?
where
planner = ?
2017-03-03 08:56:31 TRACE BasicBinder:81 - binding parameter [2] as [BIGINT] - [5]
2017-03-03 08:56:31 TRACE BasicBinder:81 - binding parameter [1] as [BIGINT] - [6]
2017-03-03 08:56:31 WARN SqlExceptionHelper:144 - SQL Error: 156, SQLState: S1000
2017-03-03 08:56:31 ERROR SqlExceptionHelper:146 - Incorrect syntax near the keyword 'Plan'.
所以你看这里有问题。我的基础 table 称为 "plans",因为 "plan" 是 SQL 中的关键字。我的 table 也是非默认架构的一部分。
HQL 似乎没有用 "schema.plans" 替换 "Plan",它也没有替换计划程序的列名称,它应该是 planner_id。
我是不是做错了什么?我已经编写了其他 HQL 没有问题,但是那些底层 table 名称与实体名称匹配并且都是 Select 语句。
我想我可以只指定基础 table 名称,但这是否意味着我还必须指定列名?我最关心的是模式。我为使用该产品的不同客户使用不同的模式。因此,我不想有任何硬编码模式。
您正在使用 createSQLQuery()
。顾名思义,这需要 SQL,而不是 HQL。