【问题标题】:In JPA, relational databases and etc., What is a Tuple? [closed]在JPA、关系数据库等中,什么是元组? [关闭]
【发布时间】:2016-07-04 20:01:08
【问题描述】:

我正在研究 Hibernate 和 JPA,我一直在寻找这个术语。有人可以以实用和教学的方式向我解释一下,这个术语是什么,以及它与 JPA / Hibernate / Databases 有何关系?

我想知道它是否是一种包含任何类型数据的数据结构,但我不确定是否真的如此。另外,我不知道它在与 JPA 的查询中的关系......谁能给我一些启示?

编辑

伙计们,不要沉淀。我在 google、dictionary(英语)、维基百科、社区(stackoverflow)以及 JPA Tuple API 中进行了搜索。

以下是我的一些搜索词:

  • 什么是元组
  • 元组
  • 数据库元组
  • JPA 元组

Java EE 6 中关于 Tuple 的所有文档如下:

用于提取查询结果元素的接口tuple

这就解释了“很多”。

我找不到具体、扎实、简洁、真正解释它是什么的东西。对于像我这样的凡人来说,这很困难,生来就什么都不知道。我母语不是英语,我无法接触到宇宙的全部内容,有时我试图让这个社区成为最实用、最简单、最友好、最受人尊敬的问答。这永远不够。不要以为我来这里之前没有研究任何东西,我是无知的,外行的,懒惰的等等。这是先入为主!

看在上帝的份上……我使用翻译器写作,对于某些对其他人来说很容易理解的事情,我没有实际的理解。我的问题甚至遵循此处对 stackoverflow 提出的问题的规则。当我问某事时,它总是某事。当我尝试给出答案时,我总是尝试在之前进行研究,并尽我所能回应其他用户。给我一些悔恨,有时参加一些社区...我要求知识,而不是地位,我相信其他人可能有同样的问题。人们通常将这个社区视为禁忌,而不是交流知识的地方。再次......为了上帝的爱......

【问题讨论】:

  • 您可以轻松地在网络上进行搜索,并在计算方面对其进行了充分解释。 JPA 特定的类是docs.oracle.com/javaee/6/api/javax/persistence/Tuple.html
  • 有时,对于我们这些母语不是英语的人来说,元组作为一个名称经常会产生误导。我,我经常将它与 KeyValuePair 混为一谈 - 因为我例如有“三重”、“四重”这样的词——所以我很自然地认为元组是两个值的序列。好吧,它不是:/

标签: java database hibernate jpa


【解决方案1】:

元组是取自数学的通用术语,仅表示“按特定顺序排列的多个值”。如果你可以说“给我这个东西的第二个值”,那么这个东西就是一个元组。

它们没有单一的符号,但您可以想象(1,2,3)("a","b","c")("John", "Smith", 12, false) 都是元组的示例,分别具有 3、3 和 4 个项目。请注意,元组的思想对值没有任何限制,因此它们可以有不同的类型。

从技术上讲,ListString[]Vector 都是元组。但在 Java 等语言中,该术语主要用于不同类型的项目 - 否则我们会谈论序列。

在 JPA 等库中,该术语可与术语 recordrow 互换使用。元组可以用特殊的类来表示,但在 Java 中经常使用的一种方法就是使用 Object[]

【讨论】:

  • 感谢您的回复和关注@fdreger。我真的很感谢你的帮助。现在我可以继续学习了。谢谢。
【解决方案2】:

如前所述,Tuple 是事物的有序列表。它有助于理解为什么你会使用这样的东西。假设您在数据库中有一个表,并且无论出于何种原因,您只想从该表中选择一些列。从这样的查询中,您可以获得对象和元组。例如,考虑一个有两个字段的实体,latitudelongitude

@Entity
public class User {
    @Id @GeneratedValue private Long id;

    private BigDecimal latitude;
    private BigDecimal longitude;

当您想查询纬度和经度列时,您将结果放在哪里?其中一种方法是使用Tuples

// With objects, the alias information is lost.
List<Object[]> s = em.createQuery("select u.lattitude as lattitude, u.longitude as longitude from User u", Object[].class).getResultList();
s.stream().forEach((record) -> {
    System.out.println(record[0]+","+record[1]);
});

// With Tuples, the alias information is retained.
List<Tuple> t = em.createQuery("select u.lattitude as lattitude, u.longitude as longitude from User u", Tuple.class).getResultList();
t.stream().forEach((record) -> {
    System.out.println( record.get("lattitude") +","+record.get("longitude"));
});

如您所见,Tuples 有一个由查询填写的alias 属性,您可以稍后使用该属性。这比Object 更方便。此外,TupleElement 支持 Java 泛型,因此您还可以获得比 Objects 更多的类型安全性。

【讨论】:

  • 感谢您的回答。我会认为用户@fdreger 的回答是正确的,原因有两个:他在这个词上给了我坚实的基础,而且他之前回答过。但是您回答了我关于该术语与其他术语的关系的问题的第二部分,因此,我也不能不考虑您的帮助。谢谢你。谢谢你,真的。
  • 嗨,我们的项目中有 Spring 4.3.18、Hibernate 4.2.18 和 JPA 1.11.18,我们有同样的问题,我们需要执行原生 oracle 查询,并将其映射到 DTO目的。我可以使用 Hibernate 的转换器,但我们认为在没有休眠干预的情况下从查询中获取 jpa Tuple 并将其手动映射到 DTO 会更好地提高性能。但是我们从 Hibernate 收到此错误,因为它在 JPA 实体管理器中配置为 JPAVendorProvider。错误是:org.hibernate.MappingException:未知实体:javax.persistence.Tuple
  • 这是正确答案,对象数组的区别很关键。
猜你喜欢
  • 1970-01-01
  • 2010-10-19
  • 2011-09-13
  • 2017-09-20
  • 1970-01-01
  • 1970-01-01
  • 2022-12-15
  • 1970-01-01
  • 2013-11-30
相关资源
最近更新 更多