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

IN和MEMQ OF JPQL运算符之间有什么区别?

洪黎昕
2023-03-14
问题内容

INMEMBER OFJPQL运算符有什么区别?


问题答案:

IN测试是您提供给查询(或通过子查询获取)的值中的单值路径表达式(实体的持久属性)的值。

MEMBER OF测试是您提供的值,用于查询(或使用表达式定义)实体中某些集合中的值成员。

让我们使用以下示例实体:

@Entity
public class EntityA {
    private @Id Integer id;
    private Integer someValue;
    @ElementCollection
    List<Integer> listOfValues;

    public EntityA() { }

    public EntityA(Integer id, Integer someValue, List<Integer> listOfValues) {
        this.id = id;
        this.someValue = someValue;
        this.listOfValues = listOfValues;
    }
}

以及以下测试数据

EntityA a1 = new EntityA(1, 1, Arrays.asList(4, 5, 6));
EntityA a2 = new EntityA(2, 2, Arrays.asList(7, 8, 9));

通过以下查询,我们得到a1作为结果,因为它的someValue是(0,1,3)之一。在查询中使用文字(在 SELECT A FROM EntityA
WHERE a.someValue IN(0,1,3)中
)产生相同的结果。

TypedQuery<EntityA> queryIn = em.createQuery(
    "SELECT a FROM EntityA a WHERE a.someValue IN :values", EntityA.class);
queryIn.setParameter("values", Arrays.asList(0, 1, 3));
List<EntityA> resultIn = queryIn.getResultList();

通过以下查询,我们得到a2作为结果,因为7是listOfValues中的值之一:

TypedQuery<EntityA> queryMemberOf = em.createQuery(
    "SELECT a FROM EntityA a WHERE :value MEMBER OF a.listOfValues", EntityA.class);
queryMemberOf.setParameter("value", 7);
List<EntityA> resultMemberOf = queryMemberOf.getResultList();

此功能(包括作为参数的集合)在JPA 2.0规范中定义,并且不特定于Hibernate(例如,上面的代码可与EclipseLink一起使用)。



 类似资料:
  • 问题内容: 如果移位的数字为正,>>>和>>的工作原理相同。 如果移位数为负,>>>将最高有效位填充为1,而>>操作将MSB填充为0。 我的理解正确吗? 如果负数是在MSB设置为1的情况下存储的,而不是Java使用2s补码的方式,则运算符的行为将完全不同,对吗? 问题答案: 表示负数的方式称为2的补码。为了演示其工作原理,以-12为例。12的二进制值为00001100(假设整数为8位,尽管实际上它

  • 问题内容: 和之间有什么区别?它们都创建一个类的实例,我不确定它们之间有什么区别。 问题答案: 在操作创建一个是静态已知的(在编译时),并可以调用你想创建对象的任何构造一个类型的新对象。这是创建对象的首选方式- 快速且JVM对它进行了许多积极的优化。 是一个动态构造,用于查找具有特定名称的类。它比使用速度慢,因为无法将对象的类型硬编码到字节码中,并且因为JVM可能必须执行权限检查以确保您有权创建对

  • 我知道什么是“代号”...在循环中(它迭代键),但我听说过(它迭代值)。 我对循环。 我知道迭代属性值。那么为什么它不记录而不记录? 与用于...的循环中,该循环迭代每个键()并迭代键,不迭代属性的值,即。为什么会这样? 在这里,我控制台的循环。它应该记录,但它记录。为什么? 示例链接

  • 问题内容: 在此示例中: 无法编译为: 而被编译器接受。 这个答案说明唯一的区别是,与不同,它允许您稍后引用类型,似乎并非如此。 是什么区别,并在这种情况下,为什么不第一编译? 问题答案: 通过使用以下签名定义方法: 并像这样调用它: 在jls§8.1.2中,我们发现(有趣的部分被我加粗了): 通用类声明定义了一组参数化类型(第4.5节), 每种可能通过类型arguments调用类型参数节的类型

  • 问题内容: Java中的和运算符有什么区别? 问题答案: 是算术右移,是逻辑右移。 在算术移位中,将扩展符号位以保留数字的符号性。 例如:用8位表示的将是(因为最高有效位的权重为负)。使用算术移位将其右移一位,你将得到1。但是,逻辑右移并不关心该值是否可能表示带符号的数字;它只是将所有内容移至右侧,并从左侧填充0。使用逻辑移位将右移一位将得到。

  • 问题内容: 我正在更深入地学习哈希码,并发现: 1.如果覆盖equals(),则也必须覆盖hashcode()。 2.要查找2个对象是否为同一对象,请使用==运算符 考虑到这两个因素,在Java中,我假设使用什么来比较 两个实例是否相同, 实际上在做 但是通过运行下面的测试,似乎我错了。 根据使用并查看是否调用的测试。 所以我的问题是,如果可以用来比较对象是否相同,覆盖e 和比较方法的目的是什么?