Sak*_*Big 26 java mysql spring hibernate jpa
我正在使用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
Run Code Online (Sandbox Code Playgroud)
执行集成测试时,spring正常启动但在创建hibernate SessionFactory时失败,但有异常:
org.hibernate.MappingException: No Dialect mapping for JDBC type: 1111
Run Code Online (Sandbox Code Playgroud)
我认为我的方言应该是Mysql5Dialect,我也试过一个明确说明InnoDB,以及两个方言选项,它们不指示版本5.但我总是得到相同的'没有Dialect映射的JDBC类型:1111'消息.我的application.properties文件驻留在test/resources源文件夹中.它被JUnit Test跑者认可(我以前因为打字错误而得到例外).
属性我设置错了吗?我找不到关于这些属性名称的一些官方文档,但在这个stackoverflow答案中找到了一个提示:https://stackoverflow.com/a/25941616/1735497
期待您的回答,谢谢!
BTW该应用程序已使用弹簧启动.
Sak*_*Big 18
这里的答案基于SubOptimal的评论:
错误消息实际上表示一个列类型无法通过hibernate映射到数据库类型.就我而言,它是java.util.UUID我在某些实体中用作主键的类型.只需应用注释@Type(type="uuid-char")(适用于postgres @Type(type="pg-uuid"))
小智 10
我遇到了同样的错误,因为我的查询返回了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();
}
}
Run Code Online (Sandbox Code Playgroud)
小智 9
我遇到了同样的错误,这里的问题是存储在 DB 中的 UUID 没有转换为对象。
我尝试应用这些注释 @Type(type="uuid-char") (对于 postgres @Type(type="pg-uuid") 但它对我不起作用。
这对我有用。假设您希望使用 JPA 中的本机查询从表中获取 id 和 name。使用字段 id 和 name 创建一个像“User”这样的实体类,然后尝试将 object[] 转换为我们想要的实体。这里匹配的数据是我们从查询中获取的对象数组列表。
@Query( value = "SELECT CAST(id as varchar) id, name from users ", nativeQuery = true)
public List<Object[]> search();
public class User{
private UUID id;
private String name;
}
List<User> userList=new ArrayList<>();
for(Object[] data:matchedData){
userList.add(new User(UUID.fromString(String.valueOf(data[0])),
String.valueOf(data[1])));
}
Run Code Online (Sandbox Code Playgroud)
假设这是我们拥有的实体
请检查一些列是否返回多个在查询中有未知类型.
例如:'1'作为column_name 可以具有未知类型
和1作为column_name是Integer 是正确的.
这件事对我有用.
首先,您没有提供实体映射,以便我们可以判断是哪个列产生了这个问题。例如,它可以是UUID一JSON列或一列。
现在,您正在使用一种非常古老的 Hibernate 方言。这MySQL5Dialect适用于 MySQL 5。很可能您使用的是较新的 MySQL 版本。
因此,请尝试MySQL8Dialect改用:
spring.jpa.database-platform=org.hibernate.dialect.MySQL8Dialect
Run Code Online (Sandbox Code Playgroud)
如果您因为使用 JSON 列类型而遇到问题,请尝试提供支持非标准类型的自定义 Hibernate Dialect:
public class MySQL8JsonDialect
extends MySQL8Dialect{
public MySQL8JsonDialect() {
super();
this.registerHibernateType(
Types.OTHER, JsonStringType.class.getName()
);
}
}
Run Code Online (Sandbox Code Playgroud)
Ans 使用自定义 Hibernate 方言:
<property
name="hibernate.dialect"
value="com.vladmihalcea.book.hpjp.hibernate.type.json.MySQL8JsonDialect"
/>
Run Code Online (Sandbox Code Playgroud)
如果在执行 SQL 本机查询时遇到此异常,则需要通过以下方式传递类型addScalar:
JsonNode properties = (JsonNode) entityManager
.createNativeQuery(
"SELECT properties " +
"FROM book " +
"WHERE isbn = :isbn")
.setParameter("isbn", "978-9730228236")
.unwrap(org.hibernate.query.NativeQuery.class)
.addScalar("properties", JsonStringType.INSTANCE)
.getSingleResult();
assertEquals(
"High-Performance Java Persistence",
properties.get("title").asText()
);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
42318 次 |
| 最近记录: |