java - 为什么无法通过关系字段找到所有项目?
问题描述
我从 sql 语句开始。当我测试它时,我有那个 sql(如下所示),它在 SQL Management Studio 中运行良好,我得到了预期的结果。
select distinct p.id, p.name, m.name
from test001.npd.projects p,
test001.npd.customer,
test001.npd.manager w
where lower(p.name) like '%%' and lower(p.customer) like '%%' and lower(m.name) like '%k%'
但后来我将该语句移动到休眠createQuery
的休眠方法,如下所示:
public List<Projects> findAlike(String projectName, String customerName, String manager) {
Query q = getCurrentSession().createQuery("select p from projects p, managers m, wine_styles w where
lower(p.name) like :name and lower(p.customer) like :customer and lower(m.name) like :manager");
q.setParameter("name", "%" + projectName.toLowerCase() + "%");
q.setParameter("customer", "%" + customerName.toLowerCase() + "%");
q.setParameter("manager", "%" + manager.toLowerCase() + "%");
List<Projects> lo = (List<Projects>) q.getResultStream().distinct().collect(Collectors.toList());
return (List<Projects>) lo;
}
我遇到的问题是,当我通过name
并且customer
一切正常时,我可以通过它进行搜索,但manager
每次字段都会返回表中的所有行。
我为每个KeyListener#keyReleased
调用调用该函数,如下所示:
@Override
public void keyReleased(KeyEvent e) {
NewProdForm.getData().setProjects(NewProdForm.getData().getProjectService().findAlike(projectInput.getText(), customerInput.getText(), projectManagerInput.getText()));
NewProdForm.getAppFrame().getProjectListPanel().getTm().fireTableDataChanged();
}
而且我tabelModel
每次都提神醒脑。我的班级实现KeyListener
并在 cosntructor 中为每个人添加关键侦听器TextField
public class Search extends JPanel implements KeyListener {
private JTextField projectInput;
private JTextField customerInput;
private JTextField projectManagerInput;
private JTextField wineStyleInput;
private JTextField proposedLaunchDateInput;
private JTextField statusInput;
public Search() {
setLayout(null);
setBackground(Color.white);
projectInput = new JTextField();
customerInput = new JTextField();
projectManagerInput = new JTextField();
wineStyleInput = new JTextField();
proposedLaunchDateInput = new JTextField();
statusInput = new JTextField();
add(projectInput);
add(customerInput);
add(projectManagerInput);
add(wineStyleInput);
add(proposedLaunchDateInput);
add(statusInput);
projectInput.addKeyListener(this);
customerInput.addKeyListener(this);
projectManagerInput.addKeyListener(this);
}
}
不知道该怎么办。我搜索谷歌,但我发现的所有例子都表明我做的一切都是正确的,但我确信我不是因为我没有我的结果。
编辑
所以在一些评论建议后我创建了procedure
这样
IF (OBJECT_ID('npd.searching') IS NOT NULL)
DROP PROCEDURE npd.searching
USE test001;
GO
CREATE PROCEDURE npd.searching
@project nvarchar(50),
@customer nvarchar(50),
@manager nvarchar(50),
@wine nvarchar(50)
AS
SET NOCOUNT ON;
select p.id, p.name, m.name from test001.npd.projects p
inner join test001.npd.managers m on p.manager_id = m.id
inner join test001.npd.wine_styles w on p.wine_style_id = w.id
where
lower(p.name) like '%' + @project + '%' and
lower(p.customer) like '%' + @customer + '%' and
lower(m.name) like '%' + @manager + '%' and
lower(w.name) like '%' + @wine + '%';
GO
我像这样在 SQL Management Studio 中对其进行了测试
EXEC npd.searching '', '', 'k', '';
一切都如我所愿。所以我也想把它移到休眠状态所以我做了这样的事情
public List<Projects> findAlike(String projectName, String customerName, String manager, String wineStyle) {
Query q = getCurrentSession().createSQLQuery("EXEC npd.searching :name, :customer, :manager, :wine").addEntity(Projects.class);
q.setParameter("name", "'" + projectName.toLowerCase() + "'");
q.setParameter("customer", "'" + customerName.toLowerCase() + "'");
q.setParameter("manager", "'" + manager.toLowerCase() + "'");
q.setParameter("wine", "'" + wineStyle.toLowerCase() + "'");
List<Projects> lo = (List<Projects>) q.getResultStream().distinct().collect(Collectors.toList());
return (List<Projects>) lo;
}
但是当我调用该方法时,我什么也没得到,我的意思是我arraylist
从查询中分配数据的位置是空的。那有什么问题?
编辑[已解决]
好的,经过2小时的搜索终于找到了解决方案。我使用的上述问题的解决方案是@NamedNativeQueries
. 所以我加了
@NamedNativeQueries({
@NamedNativeQuery(
name = "searchProjects",
query = "EXEC npd.searching :project, :customer, :manager, :wine",
resultClass = Projects.class
)
})
我改变了findAlike
使用方法,@NamedNativeQuery
如下所示:
@SuppressWarnings("unchecked")
public List<Projects> findAlike(String projectName, String customerName, String manager, String wineStyle) {
Query query = getCurrentSession().getNamedQuery("searchProjects"); // THIS LINE
query.setParameter("project", projectName.toLowerCase());
query.setParameter("customer", customerName.toLowerCase());
query.setParameter("manager", manager.toLowerCase());
query.setParameter("wine", wineStyle.toLowerCase());
List<Projects> foundProjects = (List<Projects>) query.getResultStream().distinct().collect(Collectors.toList());
return foundProjects;
}
解决方案
推荐阅读
- osgi - osgi可以运行同一个bundle的多个实例吗
- python - 循环 10x 并附加到 URL 列表
- c# - 如何在每个图表系列上仅显示一个名称
- c# - 了解 Resx 文件中 Localization = True track 的哪些属性变化
- python-3.x - 找不到 /var/www/test/ 目录 (Mac OSX)
- html - 将 CSS Grid 与 Bootstrap 4 一起使用,我的布局表现得很奇怪。如果我在每个元素之间没有
标签,则所有内容都放在行中 - windows - 如何像普通文件编辑器一样编辑这个 vim 文件?
- java - Gradle - 无法确定合适的驱动程序类
- odoo - 如何在 odoo 10 中使 Many2many 字段可编辑?
- jquery - jQuery:点击