如何在SELECT查询中设置hibernate前缀N?

如何在SELECT查询中设置hibernate前缀N?,hibernate,jpa,Hibernate,Jpa,我正在使用MSSQL、Hibernate、wildfly,我的查询是: em.createQuery("select a from GeoDivType a where a.description = 'شسasфы' " , GeoDivType.class); 这将产生以下结果: Hibernate:选择geodivtype0.Id作为Id1_69_,geodivtype0.Description作为Description2_69_,geodivtype0.Name作为Name3_69_,

我正在使用MSSQL、Hibernate、wildfly,我的查询是:

em.createQuery("select a from GeoDivType a where a.description = 'شسasфы' " , GeoDivType.class);
这将产生以下结果:

Hibernate:选择geodivtype0.Id作为Id1_69_,geodivtype0.Description作为Description2_69_,geodivtype0.Name作为Name3_69_,geodivtype0.parent作为parent5_69_,geodivtype0.version作为版本4_69_,其中geodivtype0.Description='

正如您在最后看到的,有一个
Description='N'žسسasааa'
没有N前缀,如果您在sql management studio中执行精确的代码,您将一无所获,但使用
Description=N'سسasаa'
我得到了我想要的结果

我已经尝试将这些添加到Persistence.xml中

<property name="hibernate.connection.characterEncoding" value="utf8"/>
<property name="hibernate.connection.useUnicode" value="true"/>
<property name="hibernate.connection.charSet" value="UTF-8"/>
<property name="hibernate.dialect" value="serp3.util.dialect.MSSQL2012"/>
还是没什么

我的字段是
nvarchar(255)
,对于Unicode字符没有问号,我的问题是我无法选择它们

编辑:

GeoDivType的映射:

import java.io.Serializable;
import javax.persistence.*;

@Entity
@Table(name="GeoDivType")
public class GeoDivType implements Serializable {
    public GeoDivType() {
    }

    @Column(name="Id", nullable=false)  
    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @ManyToOne( fetch=FetchType.LAZY)   
    @JoinColumns({ @JoinColumn(name="parent", referencedColumnName="Id") }) 
    private serp3.entity.actor.GeoDivType parent;

    @Column(name="Name", nullable=true, length=255) 
    private String name;

    @Column(name="Description", nullable=true, length=255, columnDefinition = "nvarchar(255)")
    private String description;

    @OneToMany(mappedBy="parent")   
        private java.util.List<serp3.entity.actor.GeoDivType> childs = new java.util.ArrayList<serp3.entity.actor.GeoDivType>();

    @ManyToMany()   
    @JoinTable(name="GeoDivType_GeoDivUsage", joinColumns={ @JoinColumn(name="GeoDivTypeId") }, inverseJoinColumns={ @JoinColumn(name="geoDivUsages") })    
        private java.util.List<serp3.entity.actor.GeoDivUsage> geoDivUsages = new java.util.ArrayList<serp3.entity.actor.GeoDivUsage>();

    private void setId(long value) {
        setId(new Long(value));
    }

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

    public Long getId() {
        return id;
    }

    @Version
    @Column(name = "version")
    private Long version;

    public void setVersion(Long version) {
        this.version = version;
    }

    public Long getVersion() {
        return version;
    }

    @Override
    public int hashCode() {
        int hash = 7;
        hash = 67 * hash + java.util.Objects.hashCode(this.id);
        return hash;
    }

    @Override
    public boolean equals(Object obj) {
        if (this == obj) {
            return true;
        }
        if (obj == null) {
            return false;
        }
        if (!(obj instanceof GeoDivType)) {
            return false;
        }
        final GeoDivType other = (GeoDivType) obj;
        if (!java.util.Objects.equals(this.getId(), other.getId())) {
            return false;
        }
        return true;
    }

    public void setName(String value) {
        this.name = value;
    }

    public String getName() {
        return name;
    }

    public void setDescription(String value) {
        this.description = value;
    }

    public String getDescription() {
        return description;
    }

    public void setChilds(java.util.List<serp3.entity.actor.GeoDivType> value) {
        this.childs = value;
    }

    public java.util.List<serp3.entity.actor.GeoDivType> getChilds() {
        return childs;
    }


    public void setParent(serp3.entity.actor.GeoDivType value) {
        this.parent = value;
    }

    public serp3.entity.actor.GeoDivType getParent() {
        return parent;
    }

    public void setGeoDivUsages(java.util.List<serp3.entity.actor.GeoDivUsage> value) {
        this.geoDivUsages = value;
    }

    public java.util.List<serp3.entity.actor.GeoDivUsage> getGeoDivUsages() {
        return geoDivUsages;
    }


    public String toString() {
        return String.valueOf(getId());
    }

}
在Persistence.xml中

<property name="hibernate.connection.characterEncoding" value="utf8"/>
<property name="hibernate.connection.useUnicode" value="true"/>
<property name="hibernate.connection.charSet" value="UTF-8"/>
<property name="hibernate.dialect" value="serp3.util.dialect.MSSQL2012"/>

尝试在描述中添加columnDefinition=“nvarchar”

或扩展SQLServer方言类:

public class MySqlServerDialectNvarchar extends SQLServerDialect {

    public MySqlServerDialectNvarchar() {
         super();
         registerHibernateType(Types.NVARCHAR, 255, "string");
    }
}
并在
persistence.xml
文件中引用您的类:

 <property name="hibernate.dialect" value="..MySqlServerDialectNvarchar" />

我找到了答案。 必须使用以下参数:

javax.persistence.Query q3 = em.createQuery("select a from GeoDivType a where a.description = :param " , GeoDivType.class);
    q3.setParameter("param", "شسasва");
如果不使用以下参数:

javax.persistence.Query q3 = em.createQuery("select a from GeoDivType a where a.description = 'شسasва' " , GeoDivType.class);

它不起作用。

你能显示你的GeoDivType映射吗?没有变化,仍然是相同的sql输出,没有N前缀,没有结果。我尝试过删除数据库并在使用ur代码时重新创建它。另一个解决方案是扩展SQLServer方言,我将把实现添加到回答中我已经完成了您所说的并添加到我的问题中的事情仍然是相同的输出这不是一个常见的问题,是我还是hibernate中的常见问题?我认为这是一个已知的问题,请参见: