我已经构建了一个看起来像这样的NamedQuery:
@NamedQuery(name = "EventLog.viewDatesInclude",
query = "SELECT el FROM EventLog el WHERE el.timeMark >= :dateFrom AND "
+ "el.timeMark <= :dateTo AND "
+ "el.name IN (:inclList)")
Run Code Online (Sandbox Code Playgroud)
我想要做的是填写参数:inclList与项目列表而不是一个项目.例如,如果我有一个new List<String>() { "a", "b", "c" }如何在:inclList参数中得到它?它只允许我编纂一个字符串.例如:
setParameter("inclList", "a") // works
setParameter("inclList", "a, b") // does not work
setParameter("inclList", "'a', 'b'") // does not work
setParameter("inclList", list) // throws an exception
Run Code Online (Sandbox Code Playgroud)
我知道我可以构建一个字符串并从中构建整个Query,但我想避免开销.有没有更好的方法呢?
相关问题:如果List非常大,有没有什么好的方法来构建这样的查询?
我想将所有具有文本标记的对象加载到数据库中的任意一个小但任意数量的值中.在SQL中进行此操作的逻辑方法是构建"IN"子句.JPQL允许使用IN,但似乎需要我直接将每个参数指定给IN(例如,"in(:in1,:in2,:in3)").
有没有办法指定一个数组,或者应该展开到IN子句值的列表(或其他一些容器)?
我正在尝试使用like子句编写JPQL查询:
LIKE '%:code%'
Run Code Online (Sandbox Code Playgroud)
我想有代码= 4并找到
455 554 646 ...
我无法通过 :code = '%value%'
namedQuery.setParameter("%" + this.value + "%");
Run Code Online (Sandbox Code Playgroud)
因为在另一个地方我不需要:value被%chars 包裹.有帮助吗?
我有以下参数化的JPA或Hibernate查询:
SELECT entity FROM Entity entity WHERE name IN (?)
Run Code Online (Sandbox Code Playgroud)
我想将参数作为ArrayList <String>传递,这可能吗?Hibernate电流告诉我,那
java.lang.ClassCastException: java.util.ArrayList cannot be cast to java.lang.String
Run Code Online (Sandbox Code Playgroud)
这有可能吗?
解答:作为参数的集合仅适用于像" :name" 这样的命名参数,而不适用于像" ?" 这样的JDBC样式参数.
我的Java应用程序使用JPA进行对象持久化.业务域非常简单(只有三个类是持久的,每个类有3-5个属性).查询也很简单.问题是我应该使用哪种方法:JPQL或Criteria API?
我最近了解到可以在JPQL语句中创建新对象,如下所示:
select new Family(mother, mate, offspr)
from DomesticCat as mother
join mother.mate as mate
left join mother.kittens as offspr
Run Code Online (Sandbox Code Playgroud)
这是要避免还是要拥抱?根据良好做法,何时使用此功能是合理的?
如何限制从数据库中检索的结果数量?
select e from Entity e /* I need only 10 results for instance */Run Code Online (Sandbox Code Playgroud) 我正在使用Spring Data JPA(Hibernate作为我的JPA提供程序)并且想要定义exists附加了HQL查询的方法:
public interface MyEntityRepository extends CrudRepository<MyEntity, String> {
@Query("select count(e) from MyEntity e where ...")
public boolean existsIfBlaBla(@Param("id") String id);
}
Run Code Online (Sandbox Code Playgroud)
当我运行此查询时,我得到了一个java.lang.ClassCastException: java.lang.Long cannot be cast to java.lang.Boolean.
HQL查询如何使其工作?我知道我可以简单地返回一个Long值,然后检查我的Java代码是否count > 0,但是这个解决方法不应该是必要的,对吧?
IntelliJ IDEA在JPQL中用红色的"无法解析符号"突出显示持久的@Entity类名,这会分散注意力并掩盖实际问题.
因此,例如,我在我的存储库中声明了一个查询:
private static final String READ_BY_CANDIDATE_KEY = "SELECT cr FROM Entity AS cr left join cr.relationship AS re left join fetch cr.relationship2 WHERE re.candidateKey=:ID";
Run Code Online (Sandbox Code Playgroud)
..和"实体"带有下划线,即使"实体"是有效的类名,并且具有@Entity注释.当代码实际运行时,没有问题.
我想要让IDE了解哪些类是有效的,需要某种配置?这个配置是如何完成的?
更新:我确实有一个JPA方面,但它没有看到带注释的类.它似乎需要一个persistence.xml或orm.xml(我的项目不使用)
我正在使用Toplink essentials(JPA)+ GlassFish v3 + NetBean 6.9
我有一个复合主键表:
table (machine)
----------------
|PK machineId |
|PK workId |
| |
|______________|
Run Code Online (Sandbox Code Playgroud)
我为实体本身创建了两个实体类,第二个是PK类.
public class Machine {
@EmbeddedId
protected MachinePK machinePK;
//getter setters of fields..
}
public class MachinePK {
@Column(name = "machineId")
private String machineId;
@Column(name = "workId")
private String workId;
}
Run Code Online (Sandbox Code Playgroud)
现在.. 如何使用JPERE用WHERE编写SELECT子句?
这失败了.
SELECT m FROM Machine m WHERE m.machineId = 10
Run Code Online (Sandbox Code Playgroud)
http://www.mail-archive.com/users@openjpa.apache.org/msg03073.html
根据网页,添加"val"?不,它也失败了.
SELECT m FROM Machine m WHERE m.machineId.val = 10
Run Code Online (Sandbox Code Playgroud)
在这两种情况下,错误是:
Exception Description: Error compiling the …Run Code Online (Sandbox Code Playgroud) jpa ×10
jpql ×10
java ×8
hibernate ×3
orm ×2
annotations ×1
criteria-api ×1
eclipselink ×1
hql ×1
jpa-2.0 ×1
named-query ×1
spring-data ×1
sql ×1
sql-like ×1