本着与CriteriaQuery相关的类型安全的精神,JPA 2.0还有一个API来支持实体的Metamodel表示.
是否有人知道这个API的全功能实现(生成Metamodel而不是手动创建元模型类)?如果有人也知道在Eclipse中设置它的步骤,那将是非常棒的(我假设它就像设置注释处理器一样简单,但你永远不知道).
编辑:偶然发现了Hibernate JPA 2 Metamodel Generator.但问题仍然存在,因为我找不到jar的任何下载链接.
编辑2:少顷已经过去了,因为我问过这个问题,但我想我会回来,并添加一个链接到SourceForge上的Hibernate JPA模型生成项目
我是JPA的新手,这是我的一个查询,我有几个参数作为查询的一部分,任何参数都可以是null值
@Query(value = "SELECT ord.purchaseOrderNumber,ord.salesOrderNumber,ord.quoteNumber"
+ " FROM Order ord WHERE ord.purchaseOrderNumber LIKE :poNumber% "
+ " AND ord.salesOrderNumber LIKE :soNumber "
+ " AND ord.quoteNumber = :quoteNumber "
Run Code Online (Sandbox Code Playgroud)
上面的示例如果我的输入参数:quoteNumber为NULL则我不应该通过ord.quoteNumber = NULL进行过滤,那么如何避免这种情况
我需要在 Spring Boot Web 应用程序中对数据库中的多个表编写搜索查询。
它使用弹簧数据 jpa。我知道我们可以使用 @Query 注释和 native = true 标志在 spring 数据 jpa 中编写本机查询。
有什么方法可以在存储库类中编写查询而不是 @Query 注释,因为查询非常复杂和动态。
目前,在我的 spring @Query 中创建本机 SQL 时,我无法知道 SQL where 子句中的字段(认为是临时的)。因此我传递了整个 where 子句。
如果我将 SQL 输出到控制台并将其粘贴到我的 SQL 编辑器中,我就能够收到有效的结果集。
SELECT * FROM lorder WHERE order_id = 1196077
Run Code Online (Sandbox Code Playgroud)
控制台的最后一个 SQL 输出是:Hibernate:
/* dynamic native SQL query */ SELECT
*
FROM
lorder
WHERE
?
and the where clause value being passed in to the @query is:
order_id = 1196077
Run Code Online (Sandbox Code Playgroud)
这就是我目前正在做的事情,但不起作用。
@Query(
value = "SELECT * FROM lorder WHERE :where",
nativeQuery = true)
List<OrderEntity> listSelected(@Param("where") String where);
Run Code Online (Sandbox Code Playgroud)
不确定是否可以传递整个 where 子句,但我期待一个列表。然而我目前得到的是一个空的集合。
我正在尝试使用 JpaRepository 获取查询结果,但它对我不起作用:
public interface PeticionRepository extends JpaRepository<Peticion, Long> {
@Query(value = "select peticion from Peticion peticion where (peticion.codigo like CONCAT(?1, '%') or "
+ "peticion.contacto.direccionGeneral.nombre like CONCAT(?1, '%') or peticion.contacto.poa like CONCAT(?1, '%') or "
+ "peticion.proyecto.nombre like CONCAT (?1, '%') or peticion.datosAdicionales.estado.nombre like CONCAT(?1, '%'))")
List<Peticion> findByText(String texto);
List<Peticion> findByFilter(String unidad, String nombreIniciativa, String codigo,
LocalDate fechaConsejeroDFormat, LocalDate fechaConsejeroHFormat);
}
Run Code Online (Sandbox Code Playgroud)
在其他课程中,我需要覆盖findByFilter要创建查询的函数:
public abstract class JpaPeticionRepository implements PeticionRepository {
@PersistenceContext(name = "ExterroPU")
private EntityManager em;
public void …Run Code Online (Sandbox Code Playgroud) 是否可以在@Query批注内调用参数的方法?
例:
@Query("SELECT user " +
"FROM User user " +
"WHERE (?1.getFilter() = '*' OR user.name = ?1)");
List<User> getUsers(UserNameFilter userNameFilter);
Run Code Online (Sandbox Code Playgroud)
我知道我可以做这样的事情:
@Query("SELECT user " +
"FROM User user " +
"WHERE (?1 = '*' OR user.name = ?1)");
List<User> getUsers(String userName);
Run Code Online (Sandbox Code Playgroud)
但是,当过滤器数量增加时,这意味着我需要更改许多参数。