我有一个 JPA 实体,它有两个属性可以通过“OR”运算符而不是“AND”进行搜索。这些是 ledgerCode 和 Division:
Company comp = new Company();
ExampleMatcher matcher =
ExampleMatcher.matching().withStringMatcher(StringMatcher.CONTAINING)
.withIgnoreCase("name");
comp.setCountryCode(countryCode);
comp.setLedgerCode(ledgerCode);
comp.setDivision(division);
comp.setName(name);
List<Company> result = compSearchRepository.findAll(Example.of(comp, matcher));
Run Code Online (Sandbox Code Playgroud)
那么SQL结果应该是(假设所有参数不为空):
SELECT d
FROM COMPANY d
WHERE d.countryCode = country
OR d.ledgerCode = ledger
OR d.division = division
AND lower(d.name) LIKE '%name%'
Run Code Online (Sandbox Code Playgroud)
是否可以?如果是的话,怎么会这样呢?我在 Google 上找不到任何代码示例,也找不到 ExampleMatcher 类中的建议方法名称。
我正在尝试使用Hibernate QBE(实际上是Spring的HibernateTemplate.findByExample())来返回用户名列表.我使用"已知良好"值进行搜索(用户名"JOHN.SMITH"确实存在于数据库中).
不幸的是,我没有得到任何结果.以下是单元测试.
@Test
public void testQueryByExample() {
User qbeUser = new User();
qbeUser.setUsername("JOHN.SMITH");
List<User> userList = userDao.queryByExample(qbeUser);
Assert.notNull(userList);
Assert.isTrue(userList.size() > 0, "List of returned users must not be 0");
}
Run Code Online (Sandbox Code Playgroud)
queryByExample()方法在通用DAO中定义:
@SuppressWarnings("unchecked")
public List<T> queryByExample(T obj) {
return getHibernateTemplate().findByExample(obj);
}
Run Code Online (Sandbox Code Playgroud)
QBE是否需要任何特殊配置才能工作?
我想根据关联相关对象的值搜索我的数据源中的所有对象实例.数据模型可以简化为:类型A的对象包含类型B的对象列表.目标是查找A的所有实例,其中A包含B,使得B具有属性值X.
我已经可以使用Criteria查询成功实现此目的,如下所示:
List<A> results = session.createCriteria(A.class)
.createCriteria("listOfBs")
.add(Restrictions.eq("propertyInB", x))
.list();
Run Code Online (Sandbox Code Playgroud)
这是一种简化,B的多个属性将适用 - 搜索功能对于用户填充的过滤器是必需的.
我想通过示例查询替换这种方法 - 我只是创建一个具有所需参数的对象图.我在遵循Hibernate文档时的尝试失败了,并在此问题中进行了描述.
我认为以一种有效的方式展示我想要实现的东西,然后寻找等价物可能会有所帮助 - 这就是我重新提出这个问题的原因.
简而言之,我的问题是:如何在Hibernate中将上述Criteria Query实现为Query by Example?我正在使用Hibernate 3.6.6.
谢谢!
我的用例是我在配置单元中有一张表,其中一列为INT,另一列为Array数据类型。我想水平显示它。
我有一个带有存储库的 Spring 应用程序
interface EventRepository extends JpaRepository<Event, Long>, QueryByExampleExecutor<Event> { }
Event e = new Event();
e.setTest('ABC');
eventRepository.findAll(Example.of(e), pageable);
Run Code Online (Sandbox Code Playgroud)
工作得很好,我快到了。但我需要限制在“从”和“到”之间的日期范围内
我看到一些帖子说它不适用于 QBE,但这是在 2015 年。
我创建了一个 Range 对象,但我不知道如何应用它。
我不能使用默认的弹簧方式
@Transactional
interface EventRepository extends JpaRepository<Event, Long>, QueryByExampleExecutor<Event> {
def findBetween(Date lower, Date upper)
}
Run Code Online (Sandbox Code Playgroud)
因为我有一堆动态搜索参数。
所以,我认为至少应该有两种方法可以在此页面上显示下拉菜单,但我无法使用这两种方法。我是 kivy 和编程的新手,但我已经阅读了文档,似乎我根本不明白。
我创建了以下示例:
import kivy
kivy.require('1.7.2') # replace with your current kivy version !
from kivy.app import App
from kivy.uix.screenmanager import ScreenManager, Screen
from kivy.properties import ObjectProperty
from kivy.uix.button import Button
from kivy.uix.dropdown import DropDown
class CustomDropDown(DropDown):
pass
class HomeScreen(Screen):
translateInput = ObjectProperty(None)
translateButton = ObjectProperty(None)
translateLabel = ObjectProperty(None)
top_layout = ObjectProperty(None)
dd_btn = ObjectProperty(None)
drop_down = CustomDropDown()
#notes_dropdown = ObjectProperty(None)
dropdown = DropDown()
notes = ['Features', 'Suggestions', 'Abreviations', 'Miscellaneous']
for note in notes:
# when adding widgets, we …Run Code Online (Sandbox Code Playgroud) 假设我有一些扩展的接口CRUDRepositor。里面有类似的方法findByField。其中一些方法应该只返回属于用户有权访问的一组实体的实体(这group是数据库中的列,因此它是为大多数实体定义的字段)。我想通过允许在存储库方法上使用注释(如@Protected)来实现这一点,然后当调用这些方法而不是调用幕后调用的findByField方法时。findByFieldAndGroup通过使用 AOP(它拦截用我的 @Protected 标记注释的方法),可以在有效执行方法之前分配组。
public interface MyRepository extends CRUDRepository<MyEntity,long> {
@Protected
Optional<MyEntity> findById(Long id); // Should become findByIdAndGroup(Long id, String group) behind the scenes
@Protected
Collection<MyEntity> findAll();
}
Run Code Online (Sandbox Code Playgroud)
有办法实现这一点吗?在最坏的情况下,我要么手动添加所有方法,要么完全切换到示例查询方法(您可以更轻松地动态添加组),或者使用 ASM(操作字节码)通过 Java 代理生成方法...但是这些都是不太实用的方法,需要大量的重构。
编辑:找到这些相关问题Spring data jpa - 在执行之前修改查询 Spring Data JPA and spring-security:在数据库级别进行过滤(尤其是分页) 其他相关参考文献包括GitHub 上的此票证(没有进展,只是一种解决方案)使用 QueryDSL,它阻止使用基于方法名称的查询)和此线程。