我正在使用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"/>
答案 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);
它不起作用。