当前位置: 首页 > 面试题库 >

您将哪种Java类型用于JPA集合,为什么?

柴华灿
2023-03-14
问题内容

您在JPA域模型中使用以下哪种收集类型以及原因:

  • java.util.Collection
  • java.util.List
  • java.util.Set

我想知道是否有一些基本规则。

更新 我知道a Set和a 之间的区别List。A List允许重复且具有顺序,而a
Set不能包含重复元素且未定义顺序。我在JPA的背景下问这个问题。如果严格遵循定义,那么您应该始终使用Set类型,因为您的集合存储在关系数据库中,那里您不能重复,并且您自己定义了一个顺序,即Java中的顺序List是不一定保留在数据库中。

例如,大多数时候我使用List类型,不是因为它有顺序或允许重复(无论如何我都不能重复),因为我的组件库中的某些组件需要一个列表。


问题答案:

就像您自己的问题所建议的那样, 关键是域,而不是JPA
。JPA只是一个您可以(并且应该)以最适合您的问题的方式使用的框架。由于框架(或其限制)而选择次优解决方案通常是一个警告。

当我需要一套而不关心订单时,可以使用Set。如果出于某种原因订单很重要(排序列表,按日期排序等),则输入List

你似乎是了如指掌之间的差异CollectionSet以及List。使用一个vs.另一个的唯一原因仅取决于您的需求。您可以
使用它们与您的API(或您将来的自己)的用户交流您集合的属性 (可能是微妙的或隐含的)。

这与在整个代码中其他任何地方使用不同集合类型时遵循的规则完全相同。您可以使用ObjectCollections供所有参考使用,但是在大多数情况下,您将使用更具体的类型。

例如,当我看到一个时List,我知道它是以某种方式排序的,在这种情况下,重复项是可以接受的还是无关紧要的。当我看到时Set,我通常希望它没有重复且没有特定的顺序(除非是SortedSet)。当我看到一个时Collection,除了包含一些实体,我不希望它有更多。

关于列表排序…是的,可以保留。即使不是,而您只是使用@OrderBy,它仍然会很有用。考虑默认情况下按时间戳排序的事件日志示例。人工对列表进行重新排序没有什么意义,但是默认情况下对其进行排序仍然很有用。



 类似资料:
  • 问题内容: 在经历了以前的开发工作的代码折磨之后,我意识到我需要移动所有基于资金的列,以不使用浮点数学。在Java方面,这意味着使用BigDecimal,但在使用Hibernate / JPA和MySQL 5时,适合该列的MySQL数据类型是什么? 问题答案: 十进制和数字。 对于DECIMAL和NUMERIC类型,建议的Java映射是java.math.BigDecimal。java.math.

  • 问题内容: 在经历了先前开发人员的代码残骸之后,我意识到我需要移动所有基于资金的列,以不使用浮点数学。在Java方面,这意味着使用BigDecimal,但是在使用Hibernate / JPA和MySQL 5时,适合该列的MySQL数据类型是什么? 问题答案: 十进制和数字。 对于DECIMAL和NUMERIC类型,建议的Java映射是java.math.BigDecimal。java.math.

  • 问题内容: 假设class 扩展class 。我碰巧知道 只 包含的实例。有什么方法可以将转换为吗? 看来我唯一的选择是遍历集合,一次转换一个元素,创建一个新集合。鉴于类型擦除使得这在运行时完全不必要,这似乎完全浪费了资源。 问题答案: 您可以通过无类型的List界面进行强制转换:

  • 问题内容: 我有一个简单的类,并且可以强制转换为集合接口(或),而不会出现任何编译器错误。请注意,该类不实现任何接口或扩展任何其他类。 当我尝试将类转换为集合时,为什么Java编译器不返回 不兼容类型错误? 没有实现。我预计会出现不兼容的类型错误,因为给定当前的类签名,所以不能是。 问题答案: 不是因为它们是集合类,而是因为它们是 接口 。没有实现它们,但是可以实现它的子类。因此,这不是编译时错误

  • 问题内容: 我正在尝试通过Java代码(hibernate)从MySQL DB获得MD5加密的通行证。但是我既不能得到String也不能得到任何合理的Java类型。 我得到的唯一消息是此无用的消息: java.lang.ClassCastException:[B不能转换为com.mysql.jdbc.Blob (或我尝试转换为的任何Java类型)。 这是我的方法: 这是完整的堆栈跟踪: 问题答案:

  • 我知道在java Collections类中,有一个静态方法排序: 排序中的第二个参数应该是实现比较器接口及其比较方法的对象。 但当我学习lambda的方法参考时,我看到了以下示例: } 这是实例方法的方法引用示例。compareWord方法与Comparator接口无关,我不明白为什么会这样?有人能解释一下吗? 非常感谢。