我正在开发一个带有数据库连接的游戏,我使用JPA来保存我的数据.这是我的游戏实体:
@Entity
@Table(name = "game")
public class Game implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "game_id")
private int id;
@Column(name = "name")
private String name;
@Column(name = "nbTurns")
private int nbTurns;
@Column(name = "playedOn")
@Temporal(TemporalType.TIMESTAMP)
private Date playedOn;
@ElementCollection(fetch = FetchType.EAGER)
@CollectionTable(name = "game_humans", joinColumns = @JoinColumn(name = "game_id"))
@MapKeyColumn(name = "human_id")
@Column(name = "isDead")
private Map<Human, Boolean> humans;
Run Code Online (Sandbox Code Playgroud)
这是我的人类实体:
@Entity
@Table(name = "human")
public class Human implements Serializable {
private …Run Code Online (Sandbox Code Playgroud) 我正在使用JPQL并希望在Constructor Expression中接收一些常规参数和集合以直接创建DTO对象.但是如果Collection是空的,我总是会收到错误,因为他找不到合适的构造函数:
DTO-Class看起来如下:
public class DTO {
private long id;
private String name;
private Collection<Child> children;
public DTO (long id, String name, Collection<Child> children){
this.id = id;
this.name = name;
this.children= children;
}
}
Run Code Online (Sandbox Code Playgroud)
儿童班:
public class Child {
private String name;
private int age;
}
Run Code Online (Sandbox Code Playgroud)
现在,Constructor Expression看起来如下:
return (List<DTO>) getEm().createQuery("SELECT DISTINCT NEW de.DTO(p.id, p.name, p.childs)
FROM Parent p").getResultList();
Run Code Online (Sandbox Code Playgroud)
当前的问题是,如果Collection p.childs为空,它表示它找不到正确的构造函数,它需要(long,String,Child)而不是(long,String,Collection).
您是否有任何解决方案,或者根本无法在构造函数表达式中使用Collection?
哦还有一件事:如果我轻松创建两个构造函数(...,Collection childs AND ...,Child childs)我没有得到任何结果,但也没有错误......在我看来并不是很满意: - /
我有这样的 JPA 存储库和 JPQL 查询:
@Query("SELECT c from Campaign c" +
" left join fetch c.postsList p on p.status = :postStatus" +
" left join fetch p.platform" +
" left join fetch c.campaignStatistics stat on stat.updateDate = :updateDate" +
" where c.id =:id")
Campaign findCampaignWithPosts(
@Param("id") Long id,
@Param("postStatus") PostStatus postStatus,
@Param("updateDate") LocalDate updateDate);
Run Code Online (Sandbox Code Playgroud)
但它不起作用。我得到:
org.hibernate.hql.internal.ast.QuerySyntaxException: with-clause not allowed on fetched associations; use filters
Run Code Online (Sandbox Code Playgroud)
我去研究了有关 JPA 2.1 规范的信息,这就是我发现的:
用于连接的连接条件来自映射的连接列。这意味着 JPQL 用户通常不必知道每个关系是如何连接的。在某些情况下,需要向连接条件附加附加条件,通常是在外部连接的情况下。这可以通过 ON 子句来完成。ON 子句在 JPA 2.1 规范中定义,并且某些 JPA 提供程序可能支持。EclipseLink : …
是否可以使用"findAll"为JPARepository返回一个Collection/List of Projections?例:
@Entity
public class Login {
@Id
@GeneratedValue(strategy = GenerationType.AUTO, generator = "native")
@GenericGenerator(name = "native", strategy = "native")
private Integer id;
private String name;
private String pass;
(...)
Run Code Online (Sandbox Code Playgroud)
}
public interface LoginProjection {
public String getName();
}
@Repository
public interface LoginRepository extends JpaRepository<Login, Long> {
Login findByName(String name);
@Query(value = "SELECT name FROM login", nativeQuery = true)
List<LoginProjection> findAllLoginProjection();
}
Run Code Online (Sandbox Code Playgroud)
使用@Query它的工作原理!但是不可能使用
List<LoginProjection> findAll();
Run Code Online (Sandbox Code Playgroud)
因为LoginProjection它没有扩展T(登录).
我在想是否有可能为findAll提供一个"别名",就像findAllXYZ一样,它与findAll做同样的事情.使用过滤器也可以,但我不想使用它们:
List<LoginProjection> findAllByName(String name);
Run Code Online (Sandbox Code Playgroud)
我的主要目标是这样的:
@Repository
public interface LoginRepository extends JpaRepository<Login, Long> { …Run Code Online (Sandbox Code Playgroud) 在hibernate中我想运行这个JPQL/HQL查询:
select new org.test.userDTO( u.id, u.name, u.securityRoles)
FROM User u
WHERE u.name = :name
Run Code Online (Sandbox Code Playgroud)
userDTO类:
public class UserDTO {
private Integer id;
private String name;
private List<SecurityRole> securityRoles;
public UserDTO(Integer id, String name, List<SecurityRole> securityRoles) {
this.id = id;
this.name = name;
this.securityRoles = securityRoles;
}
...getters and setters...
}
Run Code Online (Sandbox Code Playgroud)
用户实体:
@Entity
public class User {
@id
private Integer id;
private String name;
@ManyToMany
@JoinTable(name = "user_has_role",
joinColumns = { @JoinColumn(name = "user_id") },
inverseJoinColumns = {@JoinColumn(name = "security_role_id") } …Run Code Online (Sandbox Code Playgroud) 我在JPQL中使用以下查询来查询其地址列为空的人.
列出rl = em.createQuery("从o中选择o为o,其中o.address为空").setFirstResult(0).setMaxResults(50).getResultList(); ...
这行代码总是返回一个空列表,显然该表确实具有与条件匹配的条目.
class Person {地址; 字符串名称; ...} class Address {String name; ...}
谁知道这个jpql语句有什么问题?提前致谢.
我正在使用JPQL查询来检查列表是否包含指定的枚举值.如果枚举值是要检查的单个元素,那么它非常简单.
在查询表达式中,
query = "... where s.status = :status";
Run Code Online (Sandbox Code Playgroud)
然后设置参数
query.setParameter("status", statusValue);
Run Code Online (Sandbox Code Playgroud)
但我想检查下面的内容
query = "... where s.status IN (:statusList)";
Run Code Online (Sandbox Code Playgroud)
where statusList是一串数字(例如"0,1,2",表示状态值列表)
但我找不到解决方案.我也s.status.ordinal() IN (statusList)查询过但没有运气.
我正在使用JPA实现:EclipseLink(JPA 2.0)
我的实体的实际名称是 SType
public enum SType
{
REQUISITION,
PURCHASE,
FINISHED,
// others
RETURN;
}
Run Code Online (Sandbox Code Playgroud)
查询:
String querySt = "select s.slipType.slipNameSt,s.slipNumberSt, s.idNr from Slip s
where s.slipType.sType IN (:enumTypeListt)";
em.createQuery(querySt).setParameter("enumTypeList", EnumSet.of(SType.REQUISITION,
SType.PURCHASE));
Run Code Online (Sandbox Code Playgroud) 有没有办法在JPA查询中引用当前时间的日期范围条件(跨数据库兼容)?
我可以
SELECT m FROM Mail m WHERE m.sentAt < :date
Run Code Online (Sandbox Code Playgroud)
但我想在不必绑定参数的情况下这样做(这样可以将其配置为命名查询存储库的一部分,并且日期计算逻辑不必输入调用代码).
因此,:date我不需要"currentTime减去3分钟"作为硬代码字面值.
如果我有使用Hibernate的方法,像这样:
public <T> T typedQuery(Query q, Class<T> type) {
List<T> results = q.list();
//result will be null or empty List ?
}
Run Code Online (Sandbox Code Playgroud)
如果查询不会从表中获取任何记录,那么result会是null空列表吗?
假设我们有一个抽象的@Entity Animal,以及几个扩展Animal的实体类,包括Dog,Cat,Monkey和Bat.
如何根据扩展实体的类过滤结果?
示例:有复选框,用户可以在其中选择要检索的实体.
[ ] Dog
[X] Cat
[X] Monkey
[ ] Bat
Run Code Online (Sandbox Code Playgroud)
现在我想检索具有在Animal类中定义的(命名)查询的实体.我可以在查询中放入什么样的查询参数,以便只返回Cat和Monkey对象?
jpql ×10
java ×7
jpa ×6
hibernate ×3
jpa-2.0 ×2
constructor ×1
datetime ×1
enums ×1
expression ×1
hql ×1
join ×1
list ×1
null ×1
persistence ×1
spring ×1