Java 使用Hibernate SQLQuery返回Postgres UUID
我读过一些关于Java 使用Hibernate SQLQuery返回Postgres UUID,java,sql,postgresql,hibernate,uuid,Java,Sql,Postgresql,Hibernate,Uuid,我读过一些关于PostgreSQL、Hibernate和UUIDs的问题,但没有一个是关于我所面临的确切问题 检查此域实体: import java.io.Serializable; import java.util.UUID; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.FetchType; import javax.persistence.Generate
PostgreSQL
、Hibernate
和UUID
s的问题,但没有一个是关于我所面临的确切问题
检查此域实体:
import java.io.Serializable;
import java.util.UUID;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.Table;
import org.hibernate.annotations.GenericGenerator;
import org.hibernate.annotations.Type;
@Entity
@Table(name = "message")
public class Message implements Serializable {
@Id
@GeneratedValue(generator = "uuid2")
@GenericGenerator(name = "uuid2", strategy = "my.UUIDGenerator")
@Type(type = "pg-uuid")
@Column(name = "id", columnDefinition = "uuid")
private UUID id;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "account")
private Account account;
@Type(type = "pg-uuid")
@Column(name = "user_created")
private UUID userCreated;
@Column(name = "message", columnDefinition = "text")
private String message;
}
我想用这个SQL查询来查询它:
StatelessSession session = sessionFactory.openStatelessSession();
sql = "select "
+ "cast(id as varchar) as \"id\" " // ugly, but works
// + "id " // does not work, produces o.h.MappingException: No Dialect mapping for JDBC type: 1111
+ "from message m "
+ "where m.account = :account "
+ "and m.chat = :chatId ";
SQLQuery query = session.createSQLQuery(sql);
query.setParameter("account", accountId);
query.setParameter("chatId", chatId);
query.setResultTransformer(AliasToEntityMapResultTransformer.INSTANCE);
List<Map<String, Object>> result = query.list();
session.close();
为了信息完整性,数据库表的定义如下:
spring.jpa.database-platform=org.hibernate.dialect.PostgreSQL9Dialect
create table message (
id uuid not null,
user_created uuid,
message text,
account uuid,
chat uuid
);
alter table public.message add constraint message_pkey primary key (id);
我使用以下环境:
- Linux 4.8.14
- OpenJDK运行时环境(build 1.8.0_111-b16)
- PostgreSQL 9.5.5
- Hibernate 5.0.11.1最终版本
- 弹簧靴1.4.2.1释放
- 在我的情况下,这是有效的
List<String> messageIdStringArrayList
= currentSession().createSQLQuery(String.format(
"select cast(m.id as varchar) " +
"from message m " +
"where m.account = '%s' " +
"and " +
"m.chat = '%s'",
String.valueOf(accountId), String.valueOf(chatId))).list();
List<UUID> messageIdArrayList = new ArrayList<>();
if (CollectionUtils.isNotEmpty(messageIdStringArrayList)) {
for (String idString : messageIdStringArrayList) {
messageIdArrayList.add(UUID.fromString(idString));
}
}
List messageidstringraylist
=currentSession().createSQLQuery(String.format(
“选择强制转换(m.id为varchar)”+
“来自消息m”+
“其中m.account='%s'”+
“和”+
“m.chat='%s'”,
String.valueOf(accountId),String.valueOf(chatId)).list();
List messageIdArrayList=新建ArrayList();
if(CollectionUtils.isNotEmpty(messageidstringraylist)){
对于(字符串idString:MessageIDStringRayList){
add(UUID.fromString(idString));
}
}
您使用的是什么Hibernate方言?spring.jpa.database platform=org.Hibernate.dialogue.postgresql9dialogue但您直接使用Hibernate,而不是通过jpa。您确定它仍在使用该方言进行配置吗?该方言设置为org.hibernate.dialogue.postgresql9dialogue
,我只是在运行时检查了代码中的值。Spring Boot属性的命名可能有点混乱。Spring Boot的一般观点是,您使用的是标准JPA,而不是非标准的Hibernate,这就是为什么要使用这个特定的名称。恐怕我现在不得不退出;我没有遇到这个问题(尽管我没有明确指定@Type
,并通过JPA接口使用Hibernate,而不是手动)。