0

我有一个 JPA 应用程序,它每天接收 GB 的字符串数据。最大的存储槽是一组可能很长并且经常重复的字符串(可能有 1000 个唯一的字符串,我可能会得到数万次重复)。为此,我创建了一个函数(需要工作,我对 postgresql 很不擅长)在这里看到:

CREATE OR REPLACE FUNCTION dedup_srvice_name(in_id bigint,in_name varchar)
RETURNS SETOF servicename
LANGUAGE plpgsql
AS $function$
DECLARE found_row servicename%ROWTYPE;
BEGIN

SELECT  into found_row  * from servicename where servicename.name = in_name LIMIT      1;
IF found_row IS NULL THEN
    INSERT INTO  servicename VALUES(in_id,in_name) returning id,name;       
    ELSE
    RETURN NEXT found_row;
    RETURN;
    END IF;               

  RETURN;
END;

这个想法是尝试插入行,除非字符串已经存在,然后返回一个现有的 ID 以供关系的另一方使用(在此示例中,许多对象具有相同的“服务名称”。

hibernate怎么知道return id是什么?我最初试图做一个“代替插入”类型的触发器,但意识到我不能在表格上做这些。

我的函数需要返回什么才能让休眠获取 ID?或者它不是那样工作的?

我的课很简单,只需要一个@SqlInsert Annotation

public class ServiceName implements Serializable {

private static final long serialVersionUID = 1L;

@Id
private int id;

@Index(name = "name")
private String name;

编辑

使用下面的答案,我做了以下事情:

            SQLQuery query = session.createSQLQuery("select id,name from dedup_srvice_name(?,?)");

            query.setParameter(0, 0).setParameter(theName);

            List<ServiceName> names = query.addEntity(ServiceName.class).list();                
            software.setName(names.get(0));

这很好用。实体重新读取 ID,我可以将其附加到我的关系中

4

1 回答 1

1

假设您有以下实体类:

@Entity
public class MyString {
  private long id;
  private String name;
  // getters & setters..
}

您可以使用 Hibernate 本机 SQL 查询:

Session session = // obtain hibernate session somehow..
String sql = // sql to call your db function..
List<MyString> mystrings = session.createSQLquery(sql).addEntity(MyString.class).list();

Hibernate 将根据结果集列名映射 java 属性。您可以使用关键字或使用注释as装饰 java 字段@Column

于 2013-07-02T02:38:29.957 回答