如何使SELECT查询中的休眠前缀N?

时间:2018-06-25 08:24:11

标签: hibernate jpa

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

em.createQuery("select a from GeoDivType a where a.description = 'شسasфы' " , GeoDivType.class);

产生以下内容:

休眠:从GeoDivType geodivtype_p> _div> _div中选择Geodivtype0_.Id作为Id1_69_,geodivtype0_.Description作为Descript2_69_,geodivtype0_.Name作为Name3_69_,geodivtype0_.parent作为parent5_69_,geodivtype0_.version作为version4_69_,

最后您会看到Description='شسasва'没有N前缀,如果您在sql management studio中执行确切的代码,您什么也不会得到,但是使用Description=N'شسasва'我会得到我想要的结果。

我尝试将这些添加到我的Persistence.xml

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

这是我的网址:

useUnicode=yes;characterEncoding=UTF-8;

一无所有。

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

编辑:

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

}

我的方言:

import org.hibernate.dialect.SQLServer2012Dialect;
import org.hibernate.type.StandardBasicTypes;

import java.sql.Types;

public class MSSQL2012 extends SQLServer2012Dialect{
    public MSSQL2012() {

        registerColumnType(Types.CHAR, "nchar(1)");
        registerColumnType(Types.LONGVARCHAR, "nvarchar(max)" );
        registerColumnType(Types.VARCHAR, 4000, "nvarchar($l)");
        registerColumnType(Types.VARCHAR, "nvarchar(max)");
        registerColumnType(Types.CLOB, "nvarchar(max)" );
        registerColumnType(Types.NCHAR, "nchar(1)");
        registerColumnType(Types.LONGNVARCHAR, "nvarchar(max)");
        registerColumnType(Types.NVARCHAR, 4000, "nvarchar($l)");
        registerColumnType(Types.NVARCHAR, "nvarchar(max)");
        registerColumnType(Types.NCLOB, "nvarchar(max)");
        registerHibernateType(Types.NCHAR, StandardBasicTypes.CHARACTER.getName());
        registerHibernateType(Types.LONGNVARCHAR, StandardBasicTypes.TEXT.getName());
        registerHibernateType(Types.NVARCHAR, StandardBasicTypes.STRING.getName());
        registerHibernateType(Types.NCLOB, StandardBasicTypes.CLOB.getName() );
    }
}

在Persistence.xml中

<property name="hibernate.dialect" value="serp3.util.dialect.MSSQL2012"/>

2 个答案:

答案 0 :(得分:0)

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

或扩展SQLServerDialect类:

public class MySqlServerDialectNvarchar extends SQLServerDialect {

    public MySqlServerDialectNvarchar() {
         super();
         registerHibernateType(Types.NVARCHAR, 255, "string");
    }
}

并在persistence.xml文件中引用您的课程:

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

答案 1 :(得分:0)

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

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

它不起作用。