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

这在本机MS工具中有效:

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


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

我试过反引号[Active?\]

我已经尝试使用/进行转义! [Active / !?]无效,反之亦然!/ [Active!/?]。

我也到处查看了很多堆栈溢出和网络论坛,以寻求其他建议,但我尝试过的其他方法均无效。

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

具体错误是查询异常

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


而且,它就像一个魅力。

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

10-12 00:01
查看更多