代码之家  ›  专栏  ›  技术社区  ›  Edy Bourne

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

  •  2
  • Edy Bourne  · 技术社区  · 14 年前

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

    where (role0_.ROLE_ID=2L )
    

    致:

    where (role0_.ROLE_ID=`2L` )
    

    价值观

    完整生成的查询是:

    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 )
    

    基本上我希望这个单引号由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();
    

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

    跟进:

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

    角色类就是这样被注释的:

    @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>();
    
    ...
    
    }
    

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

    爱德华多

    2 回复  |  直到 14 年前
        1
  •  1
  •   hisdrewness    14 年前

    把你的身份证改成 Long

        2
  •  6
  •   Arkady Syamtomov    9 年前

    hibernate属性 hibernate.global_quoted_identifiers=true 会成功的