3

这是一个 SQL Server 数据库,开发人员在多年前为布尔值制作了一个包含?字符的列名。许多系统都访问此数据库,因此更改此列名对我来说并不是一个真正的选择。

这适用于本机 MS 工具:

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

相同的查询在Hibernate 尝试将括号内的字段名称session.createSQLQuery解释为参数时抛出错误。?

我试过反引号 [ Active?\]

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

我还查看了很多堆栈溢出和网络论坛以获取其他建议,但我尝试过的其他事情没有奏效。

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

具体错误是查询异常

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

附有查询字符串。

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

4

2 回答 2

5

为了复制这个用例,我SQLServerEscapeQuestionCharacterTest在我的high-performance-java-persistenceGitHub 存储库中创建了。

假设您有以下 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 使用nameJPA 的属性,@Column它已经转义了列名:

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());

而且,它就像一个魅力。

于 2019-01-29T20:13:23.507 回答
-2

@ joachim-isaksson回答了[Active\\?]

于 2017-06-20T20:34:57.617 回答