JPQL查询返回NullPointerException

时间:2018-10-02 17:23:38

标签: hibernate jpa spring-data-jpa hql jpql

我的存储库界面中有以下JPQL查询:

onPressed: () {
  crudObj.addData({
    'itemName': this.itemName,
    'userEmail': _getUserAuthEmail(),
  }).then((result) {
    dialogTrigger(context);
  }).catchError((e) {
    print(e);
  });
},

这是我的MainFooEntity:

@Override
@Query(value = "SELECT mainFoo FROM MainFooEntity mainFoo JOIN FETCH mainFoo.nestedFoo.bar b WHERE b.value LIKE %:searchedFoo%")
Page<MainFooEntity> findByFoo(@Param("searchedFoo") String searchedFoo, Pageable pageable);

可嵌入的NestedFooEntity类:

@Entity
@Table
public class MainFooEntity {
   @Id
   @GeneratedValue(strategy = GenerationType.SEQUENCE)
   private Long id;

   @Embedded
   private NestedFooEntity nestedFoo;

   // ...
}

和我的自定义BarType类:

@Embeddable
public class NestedFooEntity {

    @Type(type = "com.my.BarType")
    @Column(name = "bar")
    private BarType bar;

    // ...
}

当我调用上述存储库方法时,出现以下错误:

@lombok.Value
public class BarType implements Comparable<BarType>{
    String value;

    public BarType(String value) {
        this.value = value;
    }
}

您知道我做错了吗?感谢您的建议。

2 个答案:

答案 0 :(得分:0)

根据JPA 2.1规范(重点是我的),您的Join Fetch子句不合法:

  

FETCH JOIN子句右侧引用的关联必须是从查询返回的实体或可嵌入对象引用的关联或元素集合。 不允许为FETCH JOIN子句右侧引用的对象指定标识变量,因此对隐式获取的实体或元素的引用不能出现在查询中的其他地方

>

因此,您需要将查询更改为此:

SELECT mainFoo 
FROM MainFooEntity mainFoo 
JOIN FETCH mainFoo.nestedFoo.bar 
WHERE mainFoo.nestedFoo.bar.value LIKE %:searchedFoo%

您还可以考虑向Hibernate提出问题,以改善错误消息,因为扔掉NPE有点粗鲁,不是吗?

答案 1 :(得分:0)

问题是路径(NestedFooEntity)上的类之一不是实体,它是一个可嵌入的对象。因此,它无法加入。

因此,您可以尝试:

@Query(value = "SELECT mainFoo FROM MainFooEntity mainFoo 
    JOIN FETCH mainFoo.bar
    JOIN mainFoo.bar bar
    JOIN bar.b b 
    WHERE b.value LIKE %:searchedFoo% ")