gpt4 book ai didi

sql - 在 Hibernate SQL 查询中你如何转义?字段名称中的字符

转载 作者:行者123 更新时间:2023-12-01 05:33:36 24 4
gpt4 key购买 nike

这是一个 SQL Server 数据库,开发人员在很多年前为 bool 值创建了一个包含 ? 字符的列名。许多系统访问这个数据库,所以更改这个列名对我来说不是一个真正的选择。

这适用于 native MS 工具:

SELECT * FROM MyDatabase.dbo.[My Table] WHERE [Active?]= true

同一查询在 session.createSQLQuery 中失败,Hibernate 抛出一个错误,试图将括号字段名称中的 ? 解释为参数。

我试过反引号 [Active?\]

我试过用/! [Active/!?] 反之亦然!/[Active!/?] 无效。

我还查看了很多堆栈溢出和网络论坛以寻求其他建议,但我尝试过的其他方法都没有奏效。

这是 hibernate 中的错误吗?在我看来,括号中的任何内容都不应解释为参数。

具体错误是查询异常

> Expected positional parameter count: 1, actual parameters:[]

附加查询字符串。

joachim-isaksson回答它:[Active\\?]是吗

最佳答案

为了复制这个用例,我创建了 SQLServerEscapeQuestionCharacterTest在我的 high-performance-java-persistence GitHub repository .

假设您有以下 JPA 实体:

@Entity(name = "Post")
@Table(name = "[post]")
public static class Post {

@Id
private Long id;

private String title;

@Column(name = "[active?]")
private boolean active;

public Long getId() {
return id;
}

public void setId(Long id) {
this.id = id;
}

public String getTitle() {
return title;
}

public void setTitle(String title) {
this.title = title;
}

public boolean isActive() {
return active;
}

public void setActive(boolean active) {
this.active = active;
}
}

它与以下数据库表关联:

CREATE TABLE [post] (
id bigint not null,
[active?] bit,
title varchar(255),
PRIMARY KEY (id)
)

如果您创建以下 Post 实体:

Post post = new Post();
post.setId(1L);
post.setTitle("High-Performance Java Persistence");
post.setActive(true);

entityManager.persist(post);

Hibernate 将执行正确的 INSERT 语句:

INSERT INTO [post] (
[active?],
title,
id
)
VALUES (
true,
'High-Performance Java Persistence',
1
)

执行 JPQL 查询时:

List<Post> posts = entityManager
.createQuery(
"select p " +
"from Post p " +
"where p.active = :active", Post.class)
.setParameter("active", true)
.getResultList();

assertEquals(1, posts.size());

Hibernate 使用 JPA @Columnname 属性,它已经转义了列名:

SELECT p.id AS id1_0_,
p.[active?] AS active2_0_,
p.title AS title3_0_
FROM [post] p
WHERE p.[active?] = true

对于原生 SQL 查询,您需要像这样转义 ? 字符:

List<String> posts = entityManager
.createNativeQuery(
"select p.title " +
"from [post] p " +
"where p.[active\\?] = :active")
.setParameter("active", true)
.getResultList();

assertEquals(1, posts.size());

而且,它就像一个魅力。

关于sql - 在 Hibernate SQL 查询中你如何转义?字段名称中的字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24220826/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com