Как сделать Hibernate префикс N в запросах SELECT? - PullRequest
0 голосов
/ 25 июня 2018

Я использую MSSQL, Hibernate, wildfly, и мой запрос:

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

, который выдает следующее:

Hibernate: выберите geodivtype0_.Id as Id1_69_, geodivtype0_.Description asDescript2_69_, geodivtype0_.Name как Name3_69_, geodivtype0_.parent как parent5_69_, geodivtype0_.version как version4_69_ из GeoDivType geodivtype0_, где geodivtype0_.Description = 'شس asва'

в конце без префикса, как вы можете видеть, если вы не можете использовать префикси если вы выполните точный код в 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"/>

и это на мой URL:

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 голосов
/ 25 июня 2018

Я нашел ответ. Вы должны использовать параметры:

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

это не сработает.

0 голосов
/ 25 июня 2018

Попробуйте добавить columnDefinition = "nvarchar" в ваше описание.

Или расширить класс SQLServerDialect:

public class MySqlServerDialectNvarchar extends SQLServerDialect {

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

и сделать ссылку на ваш класс в persistence.xml файле:

 <property name="hibernate.dialect" value="..MySqlServerDialectNvarchar" />
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...