java - Hibernate with Sql Server fail for nvarchar field with "No Dialect mapping..." -
i'm using hibernate's jpa-implementation access our sql server 2012 database.
when trying select nvarchar field in native query, exception "no dialect mapping jdbc type: -9".
it looks no dialect mapping jdbc type: -9 hibernate 4 , sql server 2012 or no dialect mapping jdbc type: -9 couldn't find solution me there (both not using jpa).
my database setup:
create table nvarcharexample( examplefield nvarchar(20) primary key ) insert nvarcharexample(examplefield) values ('hello') my code:
import java.io.ioexception; import javax.persistence.*; @entity class nvarcharexample { @id public string examplefield; } public class nvarchartest { public static void main(string[] args) throws ioexception, interruptedexception { string querystring = "select e.examplefield nvarcharexample e"; // establish connection entitymanagerfactory entitymanagerfactory = persistence.createentitymanagerfactory("persistenceunit"); try { entitymanager entitymanager = entitymanagerfactory.createentitymanager(); // access data using jpql entitymanager.createquery(querystring).getresultlist(); // works // access data using sql (native query) entitymanager.createnativequery(querystring).getresultlist(); // fails } { entitymanagerfactory.close(); } } } my persistence.xml
<?xml version="1.0" encoding="utf-8"?> <persistence version="2.1" xmlns="http://xmlns.jcp.org/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/xmlschema-instance" xsi:schemalocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd"> <persistence-unit name="persistenceunit"> <provider>org.hibernate.jpa.hibernatepersistenceprovider</provider> <properties> <!-- database connection settings --> <property name="javax.persistence.jdbc.driver" value="com.microsoft.sqlserver.jdbc.sqlserverdriver" /> <property name="javax.persistence.jdbc.url" value="jdbc:sqlserver://<servername>:<port>;databasename=<databasename>" /> <property name="javax.persistence.jdbc.user" value="<user>" /> <property name="javax.persistence.jdbc.password" value="<password>" /> </properties> </persistence-unit> </persistence> with sql logging enable, output in console
select nvarcharex0_.examplefield col_0_0_ nvarcharexample nvarcharex0_ select e.examplefield nvarcharexample e i'm using
hibernate-core-4.3.10.final.jarhibernate-entitymanager-4.3.10.final.jarhibernate-jpa-2.1-api-1.0.0.final.jarhibernate-commons-annotations-4.0.5.final.jarsqljdbc41.jar
what i've tried:
- using
varcharinstead ofnvarcharmakes work, neednvarchar - using jpql instead of sql works (see example code), need native query
- i tried
sqljdbc4.jarin version 4.0 , 4.1 , triedsqljdbc41.jar - i head subclassing sql server dialect class, did not have success that
- i added
<property name="dialect" value="org.hibernate.dialect.sqlserverdialect" />persistence.xml(right behind password property) - i added
<property name="hibernate.dialect" value="org.hibernate.dialect.sqlserverdialect" />persistence.xml - i changed persistence provider
<provider>org.hibernate.ejb.hibernatepersistence</provider>
i able resolve issue subclassing sqlserverdialect:
package packagename; import java.sql.types; public class sqlserverdialectwithnvarchar extends org.hibernate.dialect.sqlserverdialect { public sqlserverdialectwithnvarchar() { registerhibernatetype(types.nvarchar, 4000, "string"); } } and referencing in persistence.xml:
<property name="hibernate.dialect" value="packagename.sqlserverdialectwithnvarchar" /> ps: found issue report @ https://hibernate.atlassian.net/browse/hhh-9750, describing similar behaviour , solution (for oracle databases).
Comments
Post a Comment