java强制提交sql语句,如何强制Hibernate在生成的SQL语句中添加引号? - java

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

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

where (role0_.ROLE_ID=2L )

至:

where (role0_.ROLE_ID=`2L` )

如何强制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 )

基本上,我希望Hibernate添加此单引号。

生成该查询的条件查询为:

EntityManager entityManager = getEntityManager();

CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder();

CriteriaQuery 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)pluralAttr);

TypedQuery typedQuery = entityManager.createQuery(criteriaQuery.select(join));

return (List

)typedQuery.getResultList();

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

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

后续:数据库中id列的类型为bingint:

+---------------+--------------+------+-----+---------+-------+

| Field | Type | Null | Key | Default | Extra |

+---------------+--------------+------+-----+---------+-------+

| ROLE_ID | bigint(20) | NO | PRI | NULL | |

...

这是对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 permissions = new HashSet();

...

}

我使用每类表继承策略,这就是为什么您在生成的User和Group实体查询中看到并集的原因。他们扩展了角色。 ID在角色中定义。

谢谢!

爱德华多

参考方案

将您的ID更改为Long类类型,而不是原始类型。然后,Hibernate会简单地将查询生成为ROLE_ID = 2,这是100%有效的,因为数字不需要刻度或引号。

Java-搜索字符串数组中的字符串 - java

在Java中,我们是否有任何方法可以发现特定字符串是字符串数组的一部分。我可以避免出现一个循环。例如String [] array = {"AA","BB","CC" }; string x = "BB" 我想要一个if (some condition to tell wheth…Java:线程池如何将线程映射到可运行对象 - java

试图绕过Java并发问题,并且很难理解线程池,线程以及它们正在执行的可运行“任务”之间的关系。如果我创建一个有10个线程的线程池,那么我是否必须将相同的任务传递给池中的每个线程,或者池化的线程实际上只是与任务无关的“工人无人机”可用于执行任何任务?无论哪种方式,Executor / ExecutorService如何将正确的任务分配给正确的线程? 参考方案 …JAVA:字节码和二进制有什么区别? - java

java字节代码(已编译的语言,也称为目标代码)与机器代码(当前计算机的本机代码)之间有什么区别?我读过一些书,他们将字节码称为二进制指令,但我不知道为什么。 参考方案 字节码是独立于平台的,在Windows中运行的编译器编译的字节码仍将在linux / unix / mac中运行。机器代码是特定于平台的,如果在Windows x86中编译,则它将仅在Win…Java RegEx中的单词边界\ b - java

我在使用\b作为Java Regex中的单词定界符时遇到困难。对于text = "/* sql statement */ INSERT INTO someTable"; Pattern.compile("(?i)\binsert\b");找不到匹配项Pattern insPtrn = Pattern.compile(&…java:继承 - java

有哪些替代继承的方法? java大神给出的解决方案 有效的Java:偏重于继承而不是继承。 (这实际上也来自“四人帮”)。他提出的理由是,如果扩展类未明确设计为继承,则继承会引起很多不正常的副作用。例如,对super.someMethod()的任何调用都可以引导您通过未知代码的意外路径。取而代之的是,持有对本来应该扩展的类的引用,然后委托给它。这是与Eric…

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值