MySQLをデータベースとして使用して、Spring JPAアプリケーションに取り組んでいます。すべてのspring-jpaライブラリ、hibernateおよびmysql-connector-Javaが確実にロードされるようにしました。
Mysql 5インスタンスを実行しています。ここに私のapplication.propertiesファイルの抜粋があります:
spring.jpa.show-sql=false
spring.jpa.hibernate.ddl-auto=create-drop
spring.jpa.database-platform=org.hibernate.dialect.MySQL5Dialect
spring.datasource.url=jdbc:mysql://localhost/mydatabase
spring.datasource.username=myuser
spring.datasource.password=SUPERSECRET
spring.datasource.driverClassName=com.mysql.jdbc.Driver
統合テストを実行すると、springは適切に起動しますが、次の例外を除き、hibernate SessionFactoryの作成に失敗します。
org.hibernate.MappingException: No Dialect mapping for JDBC type: 1111
私の方言はMysql5Dialectであると思います。また、InnoDBを明示的に示すものと、バージョン5を示さない2つの方言オプションを試しました。しかし、常に同じ「JDBCタイプの方言マッピングなし:1111」メッセージ。 application.propertiesファイルはtest/resourcesソースフォルダーにあります。 JUnit Testランナーによって認識されます(タイプミスのために以前に例外を取得しました)。
設定しているプロパティは間違っていますか?これらのプロパティ名に関する公式ドキュメントは見つかりませんでしたが、このstackoverflowの答えにヒントが見つかりました: https://stackoverflow.com/a/25941616/1735497
あなたの答えを楽しみにしています、ありがとう!
ところで、アプリケーションはすでにスプリングブートを使用しています。
ここで、SubOptimalからのコメントに基づく回答:
このエラーメッセージは、実際には、1つの列タイプをhibernateによってデータベースタイプにマップできないことを示しています。私の場合、それはいくつかのエンティティで主キーとして使用する_Java.util.UUID
_型でした。注釈@Type(type="uuid-char")
を適用するだけです(postgres @Type(type="pg-uuid")
の場合)
この例外をスローする別の一般的なユースケースもあります。 void
を返す関数を呼び出します。詳細と解決策については、 こちら をご覧ください。
クエリがUUID列を返したため、同じエラーが発生しました。これを修正するために、「cast(columnName as varchar)」などのクエリを介してUUID列をvarchar型として返したところ、機能しました。
例:
public interface StudRepository extends JpaRepository<Mark, UUID> {
@Modifying
@Query(value = "SELECT Cast(stuid as varchar) id, SUM(marks) as marks FROM studs where group by stuid", nativeQuery = true)
List<Student> findMarkGroupByStuid();
public static interface Student(){
private String getId();
private String getMarks();
}
}
Queryでnknow Typeが多くの列に返されるかどうかを確認してください。
例:column_nameとして「1」不明なタイプを持つことができます
およびcolumn_nameがIntegerの場合は1は正しいOneです。
このことは私のために働いた。
SQLプロシージャ/関数を呼び出すときに、何かを返す必要がある場合があります。 void:RETURN;
または文字列(これは私のために働いた):RETURN 'OK'
私の場合、問題は、ユーザークラスにストアドプロシージャをセットアップするときにresultClasses属性を追加するのを忘れていたことです。
@NamedStoredProcedureQuery(name = "find_email",
procedureName = "find_email", resultClasses = User.class, //<--I forgot that.
parameters = {
@StoredProcedureParameter(mode = ParameterMode.IN, name = "param_email", type = String.class)
}),
Postgresを使用している場合は、タイプAbstimeの列がないことを確認してください。 Abstimeは、JPAによって認識されない内部Postgresデータ型です。この場合、TO_CHARcouldを使用してテキストに変換すると、ビジネス要件で許可されている場合に役立ちます。
これは、Hibernateを使用してvoid関数を返すときにも発生します。 AT least w/postgres。voidの処理方法がわからない。結局、voidをreturn intに変更しなければならなかった。
古いhibernate(3.x)バージョンでこのエラーが発生する場合:
戻り値の型を大文字で書かないでください。 hibernate型実装マッピングは小文字の戻り値型を使用し、それらを変換しません。
CREATE OR REPLACE FUNCTION do_something(param varchar)
RETURNS integer AS
$BODY$
...