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,而不是手动)。