我有一个 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,我可以将其附加到我的关系中