如何强制Hibernate为生成的SQL语句添加引号?

Edy*_*rne 2 java sql hibernate syntax-error

Hibernate为特定条件查询生成无效SQL.我可以通过向WHERE子句中使用的值添​​加单引号来手动修复查询.

为了解决这个问题,我更改了查询:

where (role0_.ROLE_ID=2L )
Run Code Online (Sandbox Code Playgroud)

至:

where (role0_.ROLE_ID=`2L` )
Run Code Online (Sandbox Code Playgroud)

如何强制hibernate添加单引号(在mysql中它是单引号但在其他数据库系统中它可能是其他的东西)来包含生成的SQL查询中使用的

完整生成的查询是:

select permission1_.PERMISSION_ID as PERMISSION1_12_,
    permission1_.IS_REQUIRED as IS2_12_,
    permission1_.SOURCE_ROLE_ID as SOURCE3_12_,
    permission1_.TARGET_ROLE_ID as TARGET4_12_
from (
        select ROLE_ID,
        NAME,
        DESCRIPTION,
        IS_ACTION,
        LABEL,
        null as FIRST_NAME,
        null as LAST_NAME,
        null as PASSWORD_HASH,
        1 as clazz_ from GROUPS
    union
        select ROLE_ID,
            NAME,
            null as DESCRIPTION,
            null as IS_ACTION,
            null as LABEL,
            FIRST_NAME,
            LAST_NAME,
            PASSWORD_HASH,
            2 as clazz_ from USERS
    )
role0_ inner join PERMISSIONS permission1_ on role0_.ROLE_ID=permission1_.SOURCE_ROLE_ID
    where (role0_.ROLE_ID=2L )
Run Code Online (Sandbox Code Playgroud)

基本上我希望Hibernate添加这个单引号.

生成此查询的条件查询是:

EntityManager entityManager = getEntityManager();
CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder();
CriteriaQuery<Object> criteriaQuery = criteriaBuilder.createQuery();

Class<?> queryScopeClass = temp.pack.commons.user.Role.class;
Root<?> from = criteriaQuery.from(queryScopeClass);

Path<?> idAttrPath = from.get("id");
// also tried criteriaBuilder.equal(idAttrPath, new Long(2))
Predicate predicate = criteriaBuilder.equal(idAttrPath, criteriaBuilder.literal(new Long(2)))
criteriaQuery.where(predicate);

Path<?> attributePath = from.get("permissions");
PluralAttributePath<?> pluralAttrPath = (PluralAttributePath<?>)attributePath;
PluralAttribute<?, ?, ?> pluralAttr = pluralAttrPath.getAttribute();

Join<?, ?> join = from.join((SetAttribute<Object,?>)pluralAttr);

TypedQuery<Object> typedQuery = entityManager.createQuery(criteriaQuery.select(join));
return (List<P>)typedQuery.getResultList();
Run Code Online (Sandbox Code Playgroud)

如果您有任何关于如何强制Hibernate将这些单引号添加到值(而不是列/表名称)的线索,请告诉我.

在我的实体Role中,WHERE子句中出现的id属性当然是long类型.

跟进:数据库中id列的类型是bingint:

+---------------+--------------+------+-----+---------+-------+
| Field         | Type         | Null | Key | Default | Extra |
+---------------+--------------+------+-----+---------+-------+
| ROLE_ID       | bigint(20)   | NO   | PRI | NULL    |       |

...
Run Code Online (Sandbox Code Playgroud)

这是Role类的注释方式:

@Entity(name="Role")
@Table(name = "ROLES")
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
@javax.persistence.TableGenerator(
    name="GENERATED_IDS",
    table="GENERATED_IDS",
    valueColumnName = "ID"
)
public abstract class Role implements Serializable {
    private static final long serialVersionUID = 1L;


    /**
     * The id of this role. Internal use only.
     * 
     * @since 1.0
     */
    @Id @GeneratedValue(strategy = GenerationType.TABLE, generator="GENERATED_IDS")
    @Column(name = "ROLE_ID")
    protected long id;


    /**
     * Set of permissions granted to this role.
     * 
     * @since 1.0
     */
    @OneToMany(cascade = { CascadeType.PERSIST, CascadeType.MERGE }, mappedBy="sourceRole")
    protected Set<Permission> permissions = new HashSet<Permission>();

...

}
Run Code Online (Sandbox Code Playgroud)

我使用每个类的表继承策略,这就是为什么你在生成的用户和组实体查询中看到联合的原因.他们扩展了角色.Id在Role中定义.

谢谢!

爱德华多

小智 6

hibernate属性hibernate.globally_quoted_identifiers = true将起到作用